指針和數組存儲在哪裏的問題

請教: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能指向並讀取,但不能改寫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章