相关疑难解决方法(0)

(为什么)使用未初始化的变量未定义行为?

如果我有:

unsigned int x;
x -= x;
Run Code Online (Sandbox Code Playgroud)

很明显,x 应该这样表达后是零,但到处看,他们说的行为,这种代码是不确定的,而不是仅仅值x(直到减法之前).

两个问题:

  • 这段代码的行为确实未定义吗?
    (例如,代码在兼容系统上崩溃[或更糟]?)

  • 如果是这样,为什么 C表示行为是未定义的,当非常清楚x这里应该为零时?

    即不在此定义行为给出的优势是什么?

很明显,编译器可以简单地使用它在变量中认为"方便"的任何垃圾值,并且它可以按预期工作......这种方法有什么问题?

c initialization undefined-behavior

77
推荐指数
6
解决办法
1万
查看次数

“来自整数的指针/来自没有强制转换的指针的整数”问题

这个问题旨在成为整数和指针问题之间所有初始化/分配的常见问题解答条目。


我想编写代码,将指针设置为特定的内存地址,例如0x12345678. 但是当用 gcc 编译器编译这段代码时,我得到“初始化使指针从整数而不进行强制转换”警告/错误:

int* p = 0x12345678;
Run Code Online (Sandbox Code Playgroud)

类似地,这段代码给出了“初始化从指针生成整数而不进行强制转换”:

int* p = ...;
int i =  p;
Run Code Online (Sandbox Code Playgroud)

如果我在变量声明行之外做同样的事情,消息是一样的,但说的是“赋值”而不是“初始化”:

p = 0x12345678; // "assignment makes pointer from integer without a cast"
i = p;          // "assignment makes integer from pointer without a cast"
Run Code Online (Sandbox Code Playgroud)

使用其他流行编译器的测试也会给出错误/警告消息:

  • clang 说“不兼容的整数到指针转换”
  • icc 说“类型的值int不能用于初始化类型的实体int*
  • MSVC (cl) 说“初始化int*在间接级别上与int”不同。

问题:上面的例子是有效的 C 吗?


还有一个后续问题:

这不会给出任何警告/错误:

int* p = 0;
Run Code Online (Sandbox Code Playgroud)

为什么不?

c pointers casting initialization assignment-operator

12
推荐指数
1
解决办法
2000
查看次数