C语言 : void *x = &x compiles and runs without declaring x beforehand

标签 c void-pointers

<分区>

这段代码中的错误,定义了一个空指针并通过解引用获取空指针变量的地址来初始化它,导致返回错误的值,但它编译和运行没有任何错误。 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 
*/

最佳答案

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

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

关于C语言 : void *x = &x compiles and runs without declaring x beforehand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47860155/

相关文章:

c - 为每个线程保留一个字符串列表

python - 从 Python : passing list of numpy pointers 调用 C

c++ - 可以是 char*、long 或 int 的函数参数。是否可以?

C++,bool 转换是否总是退回到 void* 的隐式转换?

c - 为什么这不指向数组中的空字符? ('\0')

c - 数组下标的类型无效 'long int[long int]'

c - C 中的大整数?

c - 如何在C中解析类似路径的字符串

c - 在 c 中有一个结构的 void* 成员是什么意思?

c++ - 为什么从指针使用类函数时会出现 SIGSEGV 错误?