相关疑难解决方法(0)

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

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


我想编写代码,将指针设置为特定的内存地址,例如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
查看次数

简洁地声明和初始化指针(即指向int的指针)

给定char的指针,可以执行以下操作:

char *s = "data";
Run Code Online (Sandbox Code Playgroud)

据我所知,这里声明了一个指针变量,为变量和数据分配了内存,后者被填充,data\0并且有问题的变量被设置为指向它的第一个字节(即变量包含一个可以的地址被解除引用).这简短而紧凑.

例如,给定指向int的指针,可以这样做:

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

或者那个:

int i = 42;
foo(&i); // prefix every time to get a pointer
bar(&i);
baz(&i);
Run Code Online (Sandbox Code Playgroud)

或者那个:

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

这有点同义反复.使用单个变量时,它很小且可以容忍.但是,它并没有对多个变量进行多次使用,从而导致代码混乱.

有没有办法干燥简洁地写同样的东西?这些是什么?有没有更广泛的编程方法,可以完全避免这个问题?可能我不应该使用指针(笑话)或什么?

c pointers dry

7
推荐指数
1
解决办法
3万
查看次数

标签 统计

c ×2

pointers ×2

assignment-operator ×1

casting ×1

dry ×1

initialization ×1