您好,登錄后才能下訂單哦!
本篇內(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ì)量的實用文章!
免責(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)容。