在下面的代码片段中,我收到此警告 - “警告:从第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;
}
答案 0 :(得分:1)
你不需要演员:
printf("value of a thru ptr=%d\n",(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 *)
演员表不是必需的。
答案 1 :(得分:0)
实际上,你根本不做同样的事情。尝试通过手动进行文本替换来摆脱宏。例如,让我们创建一个类型为unsigned char *:
的变量tmpunsigned 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.简化,简化。一旦我们简化了相关代码,错误就会立即变得明显。