1

我的意思是,为什么这会在控制台上打印相同的数字?

#include <stdio.h>
int main()
{
    char localarr[99];
    printf("%d\n",(int)localarr);
    printf("%d\n",(int)&localarr);
    return 0;
}

我知道 localarr 的地址实际上并未存储在任何变量中。但是生成的代码可以在幕后存储它,或者当我将这样的代码传递给需要 char** 的函数时,至少 gcc 可以发出警告而不是允许段错误。为什么我们会有这种行为?

相关:为什么

char **ppl = &localarr;

结果是:

error: cannot convert ‘char (*)[99]’ to ‘char**’

?

4

3 回答 3

5

不, localarr不一样 &localarr

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

  • localarr是类型char [99] ,而是&localarr类型char (*)[99]

因为类型&localarrchar(*)[99]你应该创建指向数组的指针,比如:

char(*ppl)[99] = &localarr; 

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)      

(注意:)
* localarr + 1以 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;
}

输出:(阅读评论

~$ ./a.out 
0x7fff41ad64b0 0x7fff41ad64b0    // same 
0x7fff41ad64b1 0x7fff41ad6513    // difference is 98, 4b1 + 62 = 513
A      0x7fff41ad64b0  A

注意:localarr&localarr的值相同,0x7fff41ad64b0*localarr*&localarr的值不同:

  • *localarr 是第一个元素

  • *&localarr是第一个元素的地址 **&localarr是第一个元素

  • 这意味着与第一个元素*localarr 相同**&localarrlocalarr[0]

  • 注意0x7fff41ad6513 - 0x7fff41ad64b1 = 0x62和 0x62 = 98 十进制

什么编译器错误消息是:

error: cannot convert ‘char (*)[99]’ to ‘char**’ 
                       ^                  ^ type of ppl  
                  type of &localarr 

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

于 2013-03-31T18:26:46.587 回答
1

鉴于:

#include <stdio.h>
int main()
{
    char localarr[99];
    printf("%d\n",(int)localarr);
    printf("%d\n",(int)&localarr);
    return 0;
}

的类型localarr是 99 的数组char。的类型&localarr是指向 99 数组的指针char。类型不同。但是,localarr退化为指向数组第一个字节的指针。您可以通过将地址加 1 来最清楚地发现差异(并转换代码以更可靠地处理类型 - 在 64 位系统上,转换为int截断指针):

#include <inttypes.h>
#include <stdio.h>

int main(void)
{
    char localarr[99];
    printf("0x%08" PRIXPTR "\n", (uintptr_t)( localarr+0));
    printf("0x%08" PRIXPTR "\n", (uintptr_t)(&localarr+0));
    printf("0x%08" PRIXPTR "\n", (uintptr_t)( localarr+1));
    printf("0x%08" PRIXPTR "\n", (uintptr_t)(&localarr+1));
    return 0;
}

示例输出:

0x7FFF6D12C4E0
0x7FFF6D12C4E0
0x7FFF6D12C4E1
0x7FFF6D12C543

你还问:

为什么

 char **ppl = &localarr;

导致错误cannot convert 'char (*)[99]' to 'char**'

如前所述, 的类型&localarr是指向 99 数组的指针char;这种类型既不一样也不可转换为char **,它在许多方面只是简单地呼应了错误消息所说的内容。这些类型完全不兼容。

于 2013-03-31T18:40:55.833 回答
0

如果您使用,您的陈述将起作用

字符 *localarr=calloc(99,sizeof(char));

现在将 localarr 的地址分配给 char ** 类型应该可以工作

于 2013-03-31T18:58:27.807 回答