这个问题在这里已有答案:
这段代码中的错误,定义了一个void指针并将其初始化
提领
获取void指针变量的地址,导致返回错误的值,但它编译并运行没有任何错误。 bbb
和aaa
未事先声明。有没有像开关可以暴露这种类型的错误?
#include <stdio.h>
void *bbb = &bbb;
void func(void) {
void *aaa = &aaa;
printf("Test aaa %p\n", aaa);
printf("Test bbb %p\n", bbb);
}
int main()
{
func();
return 0;
}
/* Commands used to compile
clang void_pointer1.c -Wall -o void_pointer1
-or-
gcc void_pointer1.c -Wall -o void_pointer1
./void_pointer1
*/
这是一个逻辑错误,而不是语法错误,因此编译器无法公开它。
bbb
是一个包含指向void的指针的变量。该变量有一个地址。你可以通过&bbb
获得这个地址。该地址(void **
值)隐式转换为void*
,可以分配给变量bbb
。
变量的地址在编译期间是已知的。因此,为它指定带有自身地址的指针是没有问题的。
两种情况:
全局或静态指针 - 在链接期间计算实际地址。局部变量 - 地址称为堆栈指针的偏移量。