請教:char *p="abcdef"和char s[]="abcdef"存儲在哪裏的問題?
#include <stdio.h>
int main()
{
char *p="abcdef"; //很多書上說:p在棧,“abcdef”在數據區
p[2]='W';
printf(p);
getchar();
return 0;
}
這個程序編譯通過,但是問什麼程序運行會出錯?
另一個:
#include <stdio.h>
int main()
{
char s[]="abcdef";//s在棧,“abcdef”在數據區
s[2]='W';
printf(s);
getchar();
return 0;
}
這個程序能夠正常輸出!
請問這是爲什麼?
p,s和“abcdef”分別在那個區?
解答:
答案1:
#include <stdio.h>
int main()
{
char *p="abcdef"; //很多書上說:p在棧,“abcdef”在數據區
:沒錯!!!!
p[2]='W';
printf(p);
getchar();
return 0;
}
這個程序編譯通過,但是問什麼程序運行會出錯? //p指向的是一塊常量數據區,不能修改其值!!!!
另一個:
#include <stdio.h>
int main()
{
char s[]="abcdef";//s在棧,“abcdef”在數據區 //正確!!!!!!!!!!
s[2]='W';
printf(s);
getchar();
return 0;
}
這個程序能夠正常輸出! //因爲s是一個數組,分配的是一塊棧上的內存,而上面只是一個指針,沒申請內存!
char *p="abcdef"; //"abcdef" 靜態存儲區,是常量區,不可改, p[2]企圖通過p這個指針改變常量區的內容,所以你這個程序編譯通過,運行會出錯?
char s[]="abcdef";//"abcdef" 靜態存儲區, 你賦值給s[]這個變量後,改變s[2],所以不出錯。
p, s 在同一個區,如果是局部變量,就是在棧裏面。
"abcdef"; //靜態存儲區,是常量區,不可改
答案2:
char s[]="abcdef";//s在棧,“abcdef”在棧區
數組初始化, 等價於s[0]='a', s[1]='b'...
可以簡單認爲數據區是不可寫的,棧區是可寫的
是常量數據區不可寫!!!!!!
————————————————————————————————————
char s[]="abcdef";//這是告訴編譯器,要用一個字符數組,裏面放上“abcdef”這個內容(編譯器開一個空間放上字符數組的內容)
char *p="abcdef"; //這個是告訴編譯器,要用一個指針(編譯器開一個空間放指針),讓指針指向放着“abcdef”內容的地方,eoh,這時候沒爲“abcdef”開空間,那編譯器就認爲這個是常量字符串了,自己把它放常量區裏,讓指針指向常量區的這個串。既然是常量區的東西,那以後就不能改了,儘管p能指向並讀取,但不能改寫