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 = &amp;(a[4]);ap = a + 4;

c中,数组名衰减为指针,所以a指向数组的第一个元素。这样a等价于&amp;(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]

strcpy 从整数生成指针而不进行强制转换

从‘char *’初始化‘char’从指针生成整数而不进行强制转换

可能简单但令人困惑的赋值错误