【问题标题】:Will these statements all return an address?这些语句都会返回一个地址吗?
【发布时间】:2013-11-18 14:43:15
【问题描述】:

说你在 C 中有一个字符数组。像这样:

char array[];

现在,下面哪个语句会打印出地址。我知道 1) 和 2) 会,但是 3) 也会打印出地址吗?

1) printf("Arrays adress is %x\n", array);
2) printf("Arrays adress is %x\n", &array[0]);
3) printf("Arrays adress is %x\n", &array);

【问题讨论】:

  • 如果需要您的表达来打印地址,则无。每个都调用未定义的行为。 %x 用于打印整数值。 %p 用于打印指针。
  • 我认为最好将%x 替换为%p,因为这是指针的正确格式
  • char array[]; 不会编译!它要么需要被初始化,要么为要获取的元素数量取一个确定的值。
  • @Zaibis:你似乎是对的,因为 gcc 在这个不清楚的陈述上表现得自主,并假设 array 有确切的 one 元素。
  • @alk 不,我完全不正确,我检查了它并注意到这根本无效,它只是有效,如果在同一行中完成初始化。

标签: c arrays pointers memory-address


【解决方案1】:

没有。它们都将打印垃圾值,即您的程序的行为未定义


编辑:由于 OP 现在改变了他的问题,答案是:

他们都将通过使用%p 说明符并将array&array&array[0] 中的每一个都转换为void * 来打印地址。

char array[5]; //let's assume an array of 5 chars  

printf("Arrays adress is %p\n", (void *)array);
printf("Arrays adress is %p\n", (void *)&array[0]);
printf("Arrays adress is %p\n", (void *)&array);

【讨论】:

  • 第三个是否有效且有效?因为&array[0] 等于array 我在想&array 会和&&array[0] 一样,这是不正确的,不是吗?! (如果是这样,我当然同意你的反对意见并对我的回答发表评论!)但是你能解释一下为什么&&array[0] 被认为是一个有效的地址吗?
  • @Zaibis;我没有投反对票。但是&array&&array 完全不同。后者的类型为char **,而前者的类型为char *
  • @hacks 但我说&array 等于&&array[0](不是&array 等于&&array)并且两者都应该是无效的,因为array 的声明是@987654341 @。由于数组已经是数组第一个元素的地址,那么第一个元素的地址的地址是什么?那是无效的?!不是吗?
  • @Zaibis;看来您遇到了麻烦! :)。实际上&array[0]是数组array的第一个元素(元素0)的地址。另一方面&array 是整个数组array 的地址。两者都不一样。
  • @hacks 这对我来说不是很清楚,因为我不知道数组的地址和数组的第一个元素的地址之间有什么区别,因为我很确定我已经阅读了一些两者都应该相同的地方(第一个元素地址和数组地址)。我刚刚检查了我的 K & R ANSI C 书,发现他们只是没有提到这种情况。所以我现在必须深入研究 ISO/IEC 9899。但我会让你知道我的研究。
【解决方案2】:

假设array 应为text 并且声明将是char text[] ="...something ..." 并且您将使用%p 而不是%x 并将传递的值转换为void*:是的,一些地址会被打印出来。

【讨论】:

  • 您可能因为删除线而被否决,并且将您的答案塞进一个句子中,使其很难理解。不过我只是猜测......
【解决方案3】:

不是真的,如果你想打印出内存地址(一个指针值),我会使用正确的格式:

printf("The address is: %p\n", &array);

例如,%x 将只打印作为相应参数传递的任何 int 的十六进制值。完成此操作后,所有三个语句都会打印出完全相同的内容:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char foo[] = "Some string";
    printf("%p\n%p\n%p\n", (void *)foo, (void *)&foo, (void *)&foo[0]);
    return 0;
}

打印出同样的东西,三遍。
正如 H2CO3 好心指出的那样,您需要将 printf 转换为 void 指针,尽管

通常,数组的计算结果是其第一个元素的地址。这就是为什么array&amp;array&amp;array[0] 都产生相同的值。 You can read all about it here

【讨论】:

  • 另请注意,地址需要显式转换为(void *),因为printf() 是可变参数。
  • 好的,如果我以正确的格式将&amp;array 更改为array 会发生什么?
  • @user2426316 很可能,&amp;arrayarray 具有相同的指针值,因为 array 衰减为 &amp;array[0],这是第一个元素的地址。虽然标准没有要求,但这几乎总是与数组本身的地址相同的数字。 (这是草率的措辞,因为指针不是整数,但你明白了。)
  • @user2426316:我在我的答案中添加了指向另一个 SO 问题的链接,您可能想阅读。它处理数组及其地址
猜你喜欢
  • 2016-02-20
  • 2022-01-16
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多