代码片段警告:从不同大小的整数转换为指针
在下面的代码片段中,我得到了这个警告 - “警告:投射到不同大小的整数的指针”在第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