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

时间:2014-05-21 11:39:41

标签: c pointers

在下面的代码片段中,我收到此警告 - “警告:从第25行转换为不同大小的整数” 这是我做的第三个印刷品,

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

我不理解这个警告,因为我在第二个printf中执行相同的操作(除了不使用宏)

printf("value of a thru ptr=%d\n",(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=%d\n",arr[0]);
    printf("value of a thru ptr=%d\n",(unsigned char)*ptr);
    printf("value of a thru struct ptr=%d\n",(unsigned char *)m_arr(ptr_ns_type)[0]);
    return 0;
}

2 个答案:

答案 0 :(得分:1)

你不需要演员:

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

因为ptrunsigned 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 *)演员表不是必需的。

答案 1 :(得分:0)

实际上,你根本不做同样的事情。尝试通过手动进行文本替换来摆脱宏。例如,让我们创建一个类型为unsigned char *:

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

您将收到相同的警告。因此宏与它无关。此外,转换是结构*是多余和邪恶的,因为它删除了有价值的类型检查。所以我们可以摆脱它以获得更清晰的代码:

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

当然,你仍然可以得到完全正确的警告,但希望现在能清楚地知道发生了什么。当您调用ptr_ns_type-&gt; a [0]时,您将取消引用ptr_ns_type以获取数组a,并使用[]运算符获取[0]的,这是一个unsigned char ,而不是指向unsigned char的指针。

如果要获取[0]的地址,可以省略[0]操作:

unsigned char * tmp1 =(unsigned char *)ptr_ns_type-&gt; a;

我认为这是一个练习,可以帮助你完成指针,数组,宏和强制转换的优点。请学习以下课程:   1.宏是邪恶的。只有在增加代码清晰度时才使用它们。   2.避免不必要的铸造。这不安全。   3.简化,简化。一旦我们简化了相关代码,错误就会立即变得明显。