代码片段警告:从不同大小的整数转换为指针

在下面的代码片段中,我得到了这个警告 - “警告:投射到不同大小的整数的指针”在第25行,这是我做的第3个printf,

printf("value of a thru struct ptr=%dn",(unsigned char *)m_arr(ptr_ns_type)[0]);

我不明白这个警告,因为我在第二个printf中做了同样的事情(除非不使用宏)

printf("value of a thru ptr=%dn",(unsigned char)*ptr);

为此我没有得到任何错误。 任何人都可以帮助我理解这个警告吗?

谢谢,巴德里。

#include<stdio.h>
struct ns
{
    int i;
    unsigned char a[2];
};
#define m_arr(whatever)         ((struct ns *)whatever)->a
int main()
{
    unsigned char arr[2];  
    unsigned char brr[2]; 
    struct ns ns_type;
    struct ns *ptr_ns_type;
    arr[0]=192;
    arr[1]=168;
    brr[0]=172;
    brr[1]=188;

    ns_type.i=5;
    ns_type.a[0]=brr[0];
    ptr_ns_type = &ns_type;
    unsigned char *ptr=arr;
    printf("value of a=%dn",arr[0]);
    printf("value of a thru ptr=%dn",(unsigned char)*ptr);
    printf("value of a thru struct ptr=%dn",(unsigned char *)m_arr(ptr_ns_type)[0]);
    return 0;
}

这里你不需要演员:

printf("value of a thru ptr=%dn",(unsigned char)*ptr);

因为ptr是一个指向unsigned char的指针,所以*ptr已经是一个unsigned char

但是,在这里:

(unsigned char *)m_arr(ptr_ns_type)[0]

这意味着:

(unsigned char *)((struct ns *)ptr_ns_type)->a[0]

你想投unsigned char的指针的unsigned char 。 我想你想要的是:

((struct ns *)ptr_ns_type)->a[0]

但也要注意(struct ns *)强制转换不是必需的。


其实,你根本就没有做同样的事情。 尝试通过手动替换文本来消除宏观。 例如,让我们创建一个类型为unsigned char *的变量tmp:

unsigned char* tmp1 = (unsigned char *)       ((struct ns *)ptr_ns_type)->a[0];

你会得到同样的警告。 所以这个宏与它无关。 此外,铸造是结构ns *是多余的和邪恶的,因为它消除了宝贵的类型检查。 所以我们可以摆脱它来获得更清晰的代码:

unsigned char* tmp1 = (unsigned char *)       ptr_ns_type->a[0];

当然,你仍然得到完全正确的警告,但希望现在清楚发生了什么。 当您调用ptr_ns_type-> a [0]时,您正在取消引用ptr_ns_type以获取数组a,并使用[]运算符获取[0]的值,该值是一个无符号字符,而不是指向无符号字符的指针焦炭。

如果你想获得一个[0]的地址,你可以通过忽略[0]操作来实现:

unsigned char * tmp1 =(unsigned char *)ptr_ns_type-> a;

我认为这是一个练习,可以帮助您理解指针,数组,宏和演员的优点。 请学习以下课程:1.宏是邪恶的。 只有在增加代码的清晰度时才使用它们。 2.避免不必要的铸造。 这是不安全的。 3.简化,简化。 一旦我们简化了代码,这个错误就变得非常明显。

链接地址: http://www.djcxy.com/p/28379.html

上一篇: code snippet warning: cast to pointer from integer of different size

下一篇: cast to pointer from integer of different size