【问题标题】:C pointers and arrays: [Warning] assignment makes pointer from integer without a cast [closed]C指针和数组:[警告]赋值使指针从整数而不进行强制转换[关闭]
【发布时间】: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;),我不会收到任何警告并且它有效。为什么会这样?我觉得答案很明显,但我就是看不到。

【问题讨论】:

    标签: c arrays pointers warnings


    【解决方案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 只是偶然的地址范围的一部分,幸运的是如果你搜索了很长时间的失败者:-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 2022-01-03
      相关资源
      最近更新 更多