溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

c語言打印字符亂碼和char*字符循環(huán)賦值時錯誤問題怎么解決

發(fā)布時間:2021-11-23 09:24:58 來源:億速云 閱讀:727 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“c語言打印字符亂碼和char*字符循環(huán)賦值時錯誤問題怎么解決”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

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]是在子函數(shù)中分配的內(nèi)存空間,回到主函數(shù)后你還要引用那塊被銷毀了的內(nèi)存,打印出來的肯定是亂碼。
主要是分函數(shù)分配的空間在棧里面(tmp和tmp指向的字符串內(nèi)容),分函數(shù)結(jié)束后棧銷毀,空間全部釋放。
如果改成char *tmp則不會亂碼,函數(shù)里面的變量(tmp)還是在棧里面,但是tmp指向的字符串內(nèi)容則分配在堆中,
分函數(shù)結(jié)束后棧銷毀,空間全部釋放。但tmp指向的字符串內(nèi)容還存在,SYM中存了地址,可以訪問。
不過這部分堆空間已經(jīng)是未分配的空間(垃圾空間),隨時可以被再次分配。所以雖然可以訪問但是不安全。
如果必須使用,則把char tmp[10]在函數(shù)外面定義。

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;
}

解決方案:

本程序編譯正常,運行提示“段錯誤 (核心已轉(zhuǎn)儲)”,char *未分配內(nèi)存空間,所以不能操作數(shù)組,也就是不能單個字符來賦值。必須要用內(nèi)存來分配空間。即注釋部分去掉注釋,給指針分配內(nèi)存,則就可以操作了。

“c語言打印字符亂碼和char*字符循環(huán)賦值時錯誤問題怎么解決”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI