【问题标题】:pointer arithemetic: warning: assignment makes pointer from integer without a cast [enabled by default]指针算术:警告:赋值使指针从整数不进行强制转换[默认启用]
【发布时间】:2014-09-15 10:28:27
【问题描述】:

我在学习pointer arithmetic时发现了如下代码:

#include <stdio.h>
int main()
{
    int *p, *q, *r, a, b;
    p = &a;
    q = &b;
    p = p-q;             
    r = &a;
    r = (int*)(r-q);   
    printf("p = %p\n",p);
    printf("r = %p\n",r);
}

当我编译代码时,我收到以下警告:

test.c:7:11: warning: assignment makes pointer from integer without a cast [enabled by   default]
         p = q-p;             
           ^

现在,当我运行代码时,我得到了以下输出:

p = 0x1
r = 0x1

由于输出相同,任何人都可以解释警告的意义。提前谢谢你。

【问题讨论】:

标签: c pointers warnings pointer-arithmetic


【解决方案1】:

地址减去地址,不返回地址。它返回整数,即这些地址之间的距离。

N1570 - 6.5.6p9:

当两个指针相减时,都指向同一个数组对象的元素, 或者数组对象的最后一个元素;结果是 两个数组元素的下标。结果的大小是实现定义的, 它的类型(有符号整数类型)是在 stddef.h 头文件中定义的 ptrdiff_t。 ...

【讨论】:

    【解决方案2】:

    你减去两个指针,它会给你一个整数,但你将结果存储在一个指针中。

    【讨论】:

    • result 是 ptrdiff_t 类型,它是 int 的 typedef
    【解决方案3】:

    你减去两个指针,它会给你一个正整数,但你将结果存储在一个指针中。所以这里强制类型转换......

    按如下方式进行类型转换(类型转换必须针对p-q的结果,而不仅仅是p)

        p = (int*)(p-q);
    

    通过像上面那样进行类型转换,您不会收到警告...

    【讨论】:

    • 请不要盲目投出结果,有时会很危险。
    • @Mohit Jain.. 将两个地址相减得到一个整数。如果您不想进行类型转换,则不要将结果存储在指针中。他试图仅将结果存储在指针中。跨度>
    • 正是我的观点。不要在指针变量中存储整数。指针应该存储地址。如果要存储指针差异,请使用 ptrdiff_t。此外,对不属于同一个数组的两个指针进行区分也不是很有意义。类型转换是做某事的最后解决方案,应该非常小心。
    • @ANBUSANKAR 不必是正整数。实际上两个指针不同的结果是ptrdiff_t类型,本质上是int(正负都可以)。
    猜你喜欢
    • 2016-08-20
    • 2017-05-22
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多