gpt4 book ai didi

指向数组定义明确行为的 C 指针

转载 作者:行者123 更新时间:2023-12-04 12:17:21 24 4
gpt4 key购买 nike

C 标准是否很好地定义了此函数的返回值?

int foo()
{
char buff[128];
// This is the important line:
if ((void*)buff == (void*)(&buff))
return 1;
else
return 0;
}

foo 的结果是什么?在 gccclang 上,它将始终为 1但我不认为这是由标准保证的.

最佳答案

Are they [buff and &buff] guaranteed to have the same value or is that something that just happens with gcc and clang? I ask because I don't think &buff is "the address of the start of the array," but the address of the variable buff.

它们保证是相同的值。在 C 语言中,数组可以被认为是“特殊的”,因为它们不是指针,唯一一次被如此对待是当它们被传递给一个函数并且它们退化为指针时。

出于这个原因:

buff == &buff && buff == &buff[0]

不过 buff&buff 是两种不同的类型,其中 &buff 是指向数组的指针(它们仍然指向同一个点!)。您可以对两者使用 sizeof 来亲眼看到这种差异。

这对于指针来说是一样的,正如您所说,它将返回该实际指针变量的地址。数组也不是指向自身的指针,因为为了使指针指向自身,该指针的地址需要存储在该指针变量中。

数组名只是编译器使用的一个标签,它对应于一个连续的内存块。它具有特殊的属性,上述是其中之一。

关于指向数组定义明确行为的 C 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8423284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com