C指针和数组:[警告]赋值使指针从整数而不进行强制转换[关闭]
Posted
技术标签:
【中文标题】C指针和数组:[警告]赋值使指针从整数而不进行强制转换[关闭]【英文标题】:C pointers and arrays: [Warning] assignment makes pointer from integer without a cast [closed] 【发布时间】:2014-02-18 15:38:16 【问题描述】:我在使用 C 中的指针和数组时遇到了一些问题。代码如下:
#include<stdio.h>
int *ap;
int a[5]=41,42,43,44,45;
int x;
int main()
ap = a[4];
x = *ap;
printf("%d",x);
return 0;
当我编译并运行代码时,我收到以下警告:
[警告] 赋值使指针从整数而不进行强制转换 [默认启用]
对于第 9 行 (ap = a[4];),终端崩溃。如果我将第 9 行更改为不包含位置 (ap = a;),我不会收到任何警告并且它有效。为什么会这样?我觉得答案很明显,但我就是看不到。
【问题讨论】:
【参考方案1】:在这种情况下,a[4]
是数组a
中的5th
整数,ap
是指向整数的指针,因此您将整数分配给指针,这就是警告。 所以@ 987654325@ 现在拥有45
,当您尝试取消引用它(通过执行*ap
)时,您正在尝试访问地址为45 的内存,这是一个无效地址,因此您的程序崩溃了。
您应该使用ap = &(a[4]);
或ap = a + 4;
在c
中,数组名衰减为指针,所以a
指向数组的第一个元素。这样a
等价于&(a[0])
。
【讨论】:
@njzk2 我认为不需要。指针运算处理大小。 哦,现在我觉得自己很傻。我什至在几个小时前读到过。谢谢! a[4] 是数组中的第五个整数【参考方案2】:你在做什么:(为了更好地阅读,我使用字节而不是 in)
您以int *ap
等开头,因此您的(您的计算机)内存如下所示:
-------------- memory used by some one else --------
000: ?
001: ?
...
098: ?
099: ?
-------------- your memory --------
100: something <- here is *ap
101: 41 <- here starts a[]
102: 42
103: 43
104: 44
105: 45
106: something <- here waits x
让我们看看当 (print short cut for ...print("$d", ...) 时会发生什么
print a[0] -> 41 //no surprise
print a -> 101 // because a points to the start of the array
print *a -> 41 // again the first element of array
print a+1 -> guess? 102
print *(a+1) -> whats behind 102? 42 (we all love this number)
以此类推,所以 a[0] 与 *a 相同,a[1] = *(a+1), ....
a[n] 读起来更容易。
现在,第 9 行会发生什么?
ap=a[4] // we know a[4]=*(a+4) somehow *105 ==> 45
// warning! converting int to pointer!
-------------- your memory --------
100: 45 <- here is *ap now 45
x = *ap; // wow ap is 45 -> where is 45 pointing to?
-------------- memory used by some one else --------
bang! // dont touch neighbours garden
所以“警告”不仅仅是一个警告,它是一个严重的错误。
【讨论】:
【参考方案3】:int[]
和 int*
的表示方式相同,除了 int[] 分配 (IIRC)。
ap
是一个指针,因此给它一个整数值是危险的,因为你不知道地址 45 是什么。
当您尝试访问它 (x = *ap
) 时,您尝试访问地址 45,这会导致崩溃,因为它可能不是您可以访问的内存的一部分。
【讨论】:
"int[]
和 int*
的表示方式相同" - 仅在函数参数声明中。否则,它们根本不会以相同的方式表示。数组类型的表达式在大多数情况下都会被转换为指针类型的表达式,但是数组类型和指针类型根本不一样。
45 只是偶然的地址范围的一部分,幸运的是如果你搜索了很长时间的失败者:-)以上是关于C指针和数组:[警告]赋值使指针从整数而不进行强制转换[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
从 'void *' 对 'int' 的赋值使指针从没有强制转换的整数
警告:赋值从整数中生成没有强制转换的指针[-Wint-conversion]