1. 程式人生 > >C語言裡的小坑-之方法內的常量和變數

C語言裡的小坑-之方法內的常量和變數

char* fun1()
{
    char *a;
    a = "c語言的那些小坑";
    return a;
}

char* fun2()
{
    char a[128];
    sprintf(a, "c語言的那些小坑");
    return a;
}

先看上面的程式碼 fun1 和 fun2那個會出問題?

從執行結果來看 明顯fun2掛了一堆亂碼

fun1卻是正確的,為啥呢?

我們都知道當函式結束時返回值被儲存在棧內而區域性變數都被銷燬了

而上面fun1和fun2返回的都是一個char*指標---也就是一個記憶體地址

fun2在函式結束後,返回的地址是char a[128]

;這個區域性變數的地址

但是a變數已經實際內容已經被清空了,所以列印這個地址遇到一串隨機數。或者空就不奇怪了。

那為什麼fun1的列印是正確的?

a = "c語言的那些小坑";

就應為這個字串是一個常量所以不再銷燬的範圍內

所以fun1函式結束後返回的a變數的地址內容任然存在

所以printf("坑1%s \r\n", fun1()); 就沒問題。

printf("坑2%s \r\n", fun2());就有問題