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 *未分配內存空間,因此不能操做數組,也就是不能單個字符來賦值。必需要用內存來分配空間。即註釋部分去掉註釋,給指針分配內存,則就能夠操做了。

本文同步分享在 博客「無比機智的永哥」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。函數

相關文章
相關標籤/搜索