歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C語言打印字符亂碼和char *字符循環賦值時“段錯誤 (核心已轉儲)”

C語言打印字符亂碼和char *字符循環賦值時“段錯誤 (核心已轉儲)”

日期:2017/3/1 10:07:56   编辑:Linux編程

C語言打印字符亂碼和char *字符循環賦值時“段錯誤 (核心已轉儲)”問題解決。

1.打印字符亂碼
#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[10]是在子函數中分配的內存空間,回到主函數後你還要引用那塊被銷毀了的內存,打印出來的肯定是亂碼。
主要是分函數分配的空間在棧裡面(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 *未分配內存空間,所以不能操作數組,也就是不能單個字符來賦值。必須要用內存來分配空間。即注釋部分去掉注釋,給指針分配內存,則就可以操作了。

Copyright © Linux教程網 All Rights Reserved