C语言:void * x =&x编译并运行而不事先声明x [duplicate]

问题描述 投票:1回答:2

这个问题在这里已有答案:

这段代码中的错误,定义了一个void指针并将其初始化 提领 获取void指针变量的地址,导致返回错误的值,但它编译并运行没有任何错误。 bbbaaa未事先声明。有没有像开关可以暴露这种类型的错误?

#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 
*/
c void-pointers
2个回答
4
投票

这是一个逻辑错误,而不是语法错误,因此编译器无法公开它。

bbb是一个包含指向void的指针的变量。该变量有一个地址。你可以通过&bbb获得这个地址。该地址(void **值)隐式转换为void*,可以分配给变量bbb


-1
投票

变量的地址在编译期间是已知的。因此,为它指定带有自身地址的指针是没有问题的。

两种情况:

全局或静态指针 - 在链接期间计算实际地址。局部变量 - 地址称为堆栈指针的偏移量。

© www.soinside.com 2019 - 2024. All rights reserved.