为什么localarr ==&localarr?

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)

Gri*_*han 5

不, localarr不一样 &localarr

  • localarr是第一个元素的地址,但是&localarr大小为99的字符数组的地址.偏离值是相同的,但两者在语义上是不同的.

  • localarr属于类型char [99]&localarr属于类型char (*)[99]

而由于类型&localarrchar(*)[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)

用指向字符数组的指针读取此问题