一、C中的內存與變量的關系
內存中存在三個段,分別為Text,Bss,Data.
1.Text段
用於存放代碼的
2.Bss段
用於存放未初始化的全局變量和靜態變量
3.Data段
分為三個小段
a.靜態區:用於存放初始化的全局變量,靜態變量和常量(如字符常量)。
b.棧:用於存放一般的局部變量。
c.堆:用於存放動態分配的變量。
二、char *的理解
#include <stdio.h> int main() { char *p = "sample"; *(p + 4) = '1'; return ; }
這一段代碼可以通過編譯,但是程序運行的時候會在*(p+4)='1';這一段的時候崩潰,崩潰的原因在於char*定義的p是在棧中分配的一個指針,“sample”是一個在靜態區分配了一塊常量區,指針p指向了這塊常量去,常量去是無法進行數據的更改的,所有在試圖更改“sample”的時候程序會崩潰。
三、char[]的理解
#include <stdio.h>
int main() { char a[] = "sample"; a[1] = 'b'; printf("a=%s\n", a); return 0; }
程序可以正常運行,可以發現數組a的值成功的被改成了“sbmple”。但是當我們對數組指針a進行復制的時候,程序就無法編譯通過了。
#include <stdio.h> int main() { char a[] = "sample"; a[1] = 'b'; printf("a=%s\n", a); char b[] = "book"; a = b; return 0; }
編譯的結果是 a必須為可修改的值。產生這樣的原因可以簡單的理解數組的定義過程就是 a是一個指針常量,無法修改,而它指向的一段內存卻是在棧區分配的,可以進行修改,是固定大小的一塊內存,以‘\0’結尾。
三、char* 與char[]
可以通過一段小程序來理解他們直接的而不同
#include <stdio.h> #include <stdlib.h> #include<malloc.h> #include <string.h> int main() { char *c1 = "abc"; char *c4="abc"; char c2[] = "abc"; char *c3 = (char*)malloc(3); // *c3 = "abc" //error strcpy(c3, "abc"); c3[0] = 'g'; printf("%d %d %s\n", &c1, c1, c1); printf("%d %d %s\n", &c4, c4, c4); printf("%d %d %s\n", &c2, c2, c2); printf("%d %d %s\n", &c3, c3, c3); getchar(); return 0; }
輸出結果:
6356748 4206628 abc
6356744 4206628 abc
6356740 6356740 abc
6356736 40381328 gbc
由輸出結果我們可以看出,c1,和c4指向同一塊內存,但他們的自身所在的位置是不同的。char* 和char[]初始化的地址也是不相同的。數值指針所在位置就是自己所指向的內存(有點繞,就是不可以改變的)
