use*_*358 1 c arrays callstack local memory-address
我的意思是,为什么这个数字与控制台相同?
#include <stdio.h>
int main()
{
char localarr[99];
printf("%d\n",(int)localarr);
printf("%d\n",(int)&localarr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,localarr的地址实际上并没有存储在任何变量中.但是生成的代码可以存储在幕后,或者至少gcc可以发出警告,而不是在我将此类函数传递给期望char**的函数时允许段错误.为什么我们有这种行为?
相关:为什么
char **ppl = &localarr;
Run Code Online (Sandbox Code Playgroud)
结果是:
error: cannot convert ‘char (*)[99]’ to ‘char**’
Run Code Online (Sandbox Code Playgroud)
?
不, localarr不一样 &localarr
localarr是第一个元素的地址,但是&localarr大小为99的字符数组的地址.偏离值是相同的,但两者在语义上是不同的.
localarr属于类型char [99] 而&localarr属于类型char (*)[99]
而由于类型&localarr是char(*)[99]你应该创建指针数组,如:
char(*ppl)[99] = &localarr;
Run Code Online (Sandbox Code Playgroud)
哪里ppl有一个大小为99的字符数组
为了可视化之间localarr和 &localarr之下的差异,我的图表是:
+----+----+----+---+---+----+----+----+----+----+
| '1'| '2' |'3'|............... |98 | 99 | ...........
+----+----+----+---+---+----+----+----+----+---+----+
201 202 203 ............... 210 299
^ ^
| |
(localarr) (localarr + 1)
| |
|-----------------------------------------|--------
|201 | 299 // 299 -201 = 98
^ ^
| |
(&localarr) (&localarr + 1)
Run Code Online (Sandbox Code Playgroud)
(注意:)
* localarr + 1增加一个字符大小,其中(&localarr + 1)按99数组大小递增.
看看这段代码及其输出:
int main()
{
char localarr[99] = {'A'};
printf("%p %p\n",localarr, &localarr);
printf("%p %p\n",(localarr + 1), (&localarr + 1));
printf("%c %p %c\n",*localarr, *&localarr, **&localarr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:( 阅读评论)
~$ ./a.out
0x7fff41ad64b0 0x7fff41ad64b0 // same
0x7fff41ad64b1 0x7fff41ad6513 // difference is 98, 4b1 + 62 = 513
A 0x7fff41ad64b0 A
Run Code Online (Sandbox Code Playgroud)
注:值localarr和 &localarr相同是0x7fff41ad64b0
但的值*localarr和 *&localarr不一样的:
*localarr 是第一要素
*&localarr第一个元素的地址 **&localarr是第一个元素
这意味着*localarr 与**&localarr第一个元素相同localarr[0]
注意0x7fff41ad6513 - 0x7fff41ad64b1 = 0x62,0x62 = 98十进制
什么编译器错误消息是:
error: cannot convert ‘char (*)[99]’ to ‘char**’
^ ^ type of ppl
type of &localarr
Run Code Online (Sandbox Code Playgroud)
用指向字符数组的指针读取此问题
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |