-
int (*pquadrate)(int a)=&quadrate;
int s=quadrate(a);
c語(yǔ)言不允許直接操作代碼段
代碼在代碼段
數(shù)據(jù)在數(shù)據(jù)段
程序編譯運(yùn)行的狀態(tài)在棧
變量:在數(shù)據(jù)段內(nèi)存中某個(gè)地址處存放某個(gè)類(lèi)型的數(shù)值
指針:在數(shù)據(jù)段內(nèi)存中某個(gè)地址處存放某個(gè)地址&a,該地址處存放某個(gè)變量
查看全部 -
32位4G
2的32次方=1K*1K*1K*4
4G個(gè)字節(jié)
64位
查看全部 -
a地址
*a? a指向的地址處的值
查看全部 -
gdb 斷點(diǎn)調(diào)試,單點(diǎn)調(diào)試
gcc -g main.out -o? ?-g使用gdb編譯
gbd ./main.out? 執(zhí)行
(gdb) l? 或list? 顯示源代碼
回車(chē)?yán)^續(xù)執(zhí)行剛剛的命令
start開(kāi)始執(zhí)行
print或p a 打印輸出a
n 跳到下一行
s 進(jìn)入函數(shù)
bt 查看函數(shù)堆棧
f 1 跳轉(zhuǎn)到函數(shù)1
q 退出調(diào)試
查看全部 -
函數(shù)把實(shí)參的值賦給形參,形參是個(gè)新變量,改變形參,改變不了實(shí)參
int *a=&b;? a是指針,把b的地址賦給a,a指向b
int *a? int* a? ?int * a
&取地址符
指針變量不賦初值會(huì)出錯(cuò),temp
查看全部 -
棧越往后調(diào)用的函數(shù),所占的內(nèi)存越小,從上往下調(diào)用,而數(shù)據(jù)段和代碼段則是從下往上占用內(nèi)存。全局變量,常量,靜態(tài)變量都是存在內(nèi)存的數(shù)據(jù)段中。
查看全部 -
計(jì)算機(jī)是由邏輯電路元件來(lái)組成的
計(jì)算用二進(jìn)制
顯示為十進(jìn)制
編程用十六進(jìn)制
查看全部 -
內(nèi)存分配查看全部
-
系統(tǒng)內(nèi)存分配查看全部
-
寫(xiě)寫(xiě)心得體會(huì)。
char?*str2?=?"world";
定義一個(gè)字符指針變量str2,
在gdb中用「p str2」查詢到str2所指向的值,在內(nèi)存中的位置是在低地址位的代碼段,
而不是在高地址位的棧里面,結(jié)果是這樣的:「$1 = 0x400774 "world"」。
str2本身是指針,它本身的所在是在棧里面的,用「p &str2」來(lái)查詢,得到「$2 = (char **) 0x7fffffffda98」。
所以,如果用輸入語(yǔ)句來(lái)試圖對(duì)str2指向的地址賦值的話,是會(huì)出現(xiàn)「內(nèi)存段錯(cuò)誤的」!
比如:「scanf("%s",str2);」,這樣的語(yǔ)句運(yùn)行時(shí)是會(huì)出現(xiàn)內(nèi)存段錯(cuò)誤的。
原因就在于C語(yǔ)言不運(yùn)行程序在運(yùn)行中對(duì)內(nèi)存中的代碼段進(jìn)行修改。
再對(duì)輸入語(yǔ)句進(jìn)行深入剖析,比如有「int a; scanf("%d",a);」這樣的語(yǔ)句,當(dāng)輸入整型數(shù)值時(shí),數(shù)值被傳入內(nèi)存,保存到了變量a所在的地址,實(shí)際上就是變量a本身所代表的含義就是它自身所在的內(nèi)存地址,所以數(shù)值傳入給a,實(shí)際上是傳入給a指向的地址,而a作為一個(gè)整型變量,它指向的地址就是它本身所在的地址,它是在內(nèi)存中的棧里的,所以輸入值、傳入值,沒(méi)有問(wèn)題,不會(huì)出現(xiàn)內(nèi)存段錯(cuò)誤。
但是,如果是像上面的把輸入的字符串傳入給字符指針str2的話,實(shí)際要執(zhí)行的傳入過(guò)程是把字符串傳入到str2指向的地址,而這個(gè)地址是在內(nèi)存的代碼段里,這是不允許的,所以就會(huì)出現(xiàn)內(nèi)存段錯(cuò)誤!
++++++++++++++
所以,對(duì)于指針變量,它在定義或初始化的時(shí)候,它的默認(rèn)指向地址是在內(nèi)存的「代碼段」里的,也就是說(shuō),在這種情況下,對(duì)指針變量取值的話,得到的值實(shí)際上是從內(nèi)存的「代碼段」里取出來(lái)的,根據(jù)C語(yǔ)言的規(guī)定,當(dāng)然就無(wú)法對(duì)這個(gè)值進(jìn)行重新賦值了!
所以,要改變指針變量所指向的內(nèi)存的值,不能直接去對(duì)指針變量指向的值進(jìn)行賦值,而是要改變指針的指向,也就是說(shuō),「要把地址賦值給指針變量」,而不是把值賦值給指針變量最初所指向的值。
++++++++++++++
再貼一段助于理解指針的試驗(yàn)代碼:
#include?<stdio.h> int?main() { ????????char?a[10]="hello"; ????????char?b[10]="world"; ????????char?*c="81"; ????????printf("char?*c=81,?c?is?%s\n",c); ???????? ????????c=&a; ????????printf("c?=?&a,c?is?%s\n",c); ????????printf("address?of?a?is?%d\n",a); ????????printf("address?of?value?pointed?by?c?is?%d\n",&(*c)); ????????printf("address?of?c?itself?is?%d\n",&c); ???????? ????????return?0; }
輸出結(jié)果如下:
char?*c=81,?c?is?81 c?=?&a,c?is?hello address?of?a?is?-358473008 address?of?value?pointed?by?c?is?-358473008 address?of?c?itself?is?-358473016
指針c本身也是在棧里面的,對(duì)c取地址的話取到的是c本身的地址,而要想取到c所指向的值的地址的話,要先對(duì)c取值,再對(duì)值取地址:&(*c)。
查看全部 -
數(shù)組與指針的不同在于數(shù)組是地址常量,而指針是地址變量
查看全部 -
gdb命令:x(打印內(nèi)存值)/3(輸出3個(gè)值)d(十進(jìn)制顯示) 0xffffff(開(kāi)始地址)
查看全部 -
1. ?int quadraate(int a);是一個(gè)函數(shù) ? ?int (*pquadrate)(int a)=&quadrate;將指針pquadtate指向函數(shù)quadrate! ? ?int s=(*pquadrate)(a)可以調(diào)用quadtate函數(shù),這種操作常用于回調(diào)函數(shù)
查看全部 -
計(jì)算機(jī)內(nèi)部
查看全部 -
使用調(diào)試功能 gcc -g
gdb ./? ? ? ? ? ? ? ?//開(kāi)始進(jìn)行g(shù)db調(diào)試
list? ? ? ? ? ? ? ? ? ?//列出程序
start? ? ? ? ? ? ? //單步開(kāi)始
p? ? ? ? ? ? ? ? ? //打印變量值
n? ? ? ? ? ? ? ? ?//繼續(xù)執(zhí)行
s? ? ? ? ? ? ? ? //step 跳入函數(shù)
bt? ? ? ? ? ? ? //查看函數(shù)堆
f? ? ? ? ? ? ? ?//切換函數(shù)堆
查看全部
舉報(bào)