#include <stdio.h> #include <string.h> char *SYM=""; void change(){ char tmp[10]="SYM"; printf("%d\n",tmp); SYM=tmp; } int main(int argc, char *argv[]) { change(); printf("%d\n",SYM); printf("%s\n",SYM); return 0; }
解決方案:
數組
主要是分函數分配的空間在棧裏面(tmp和tmp指向的字符串內容),分函數結束後棧銷燬,空間所有釋放。
若是改爲char *tmp則不會亂碼,函數裏面的變量(tmp)仍是在棧裏面,可是tmp指向的字符串內容則分配在堆中,
分函數結束後棧銷燬,空間所有釋放。但tmp指向的字符串內容還存在,SYM中存了地址,能夠訪問。
不過這部分堆空間已是未分配的空間(垃圾空間),隨時能夠被再次分配。因此雖然能夠訪問可是不安全。
若是必須使用,則把char tmp[10]在函數外面定義。
2.char*單個字符賦值
#include <stdio.h> #include <malloc.h> char *p=""; int main() { int i; //p=(char*)malloc(8); for(i=0;i<7;i++) { p[i]='a'; } p[i]='\0'; printf("%s\n",p); return 0; }
解決方案:安全
本程序編譯正常,運行提示「段錯誤 (核心已轉儲)」,char *未分配內存空間,因此不能操做數組,也就是不能單個字符來賦值。必需要用內存來分配空間。即註釋部分去掉註釋,給指針分配內存,則就能夠操做了。本文同步分享在 博客「無比機智的永哥」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。函數