我有这个缓冲区用于存储一些不同类型的数据:
int d;
char *current_Results;
char Results[1000];
current_Results = Results;
现在,我将下一个数据复制到此缓冲区:
d = 50;
memcpy(current_Results, &d, sizeof(d));
printf("Current data is - %d\n", (int)(*current_Results)); // "Current data is - 50" Output OK!.
(current_Results)+= sizeof(d);
d = -20;
memcpy(current_Results, &d, sizeof(d));
printf("Current data is - %d\n", (int)(*current_Results)); // "Current data is - 1" Output WRONG!.
(current_Results)+= sizeof(d);
... and so on - wrong output later on...
我做错了什么?
答案 0 :(得分:2)
我们可以用三种方式指向一个指向数组的指针。
第一种方法是从数组中取出第一个元素,并将其地址赋给指针
current_Results = &Result[0];
第二种方法就是使用数组名称。几乎在所有情况下数组名称本身都给出了数组基址..
current_Results = Result;
第三种方式,你现在使用的..使用&运算符在数组基地址上。我认为编译时会收到警告,对吧?
current_Results = &Result;
在前两种方式中,实际上是创建一个普通的char指针,当我们递增指针时,它将以一个char的大小(大多数系统上为1个字节)递增。 ie如果current_Results指向地址1000,则current_Results ++将指向1001。
在第三种情况下,您实际创建的是字符数组指针(每个指针大小为1000字节)。当你递增它时,它将增加1000(这是你的数组大小)。即指针按数据类型递增 ..在前两种情况下,您的数据类型为char *,但在第三种情况下,通过赋值,您将current_Results的数据类型设为char [1000]。所以它将从数组中递增出来。只需打印地址current_Result,
printf("%u\n",current_Results);
看看它是否以你想象的方式递增。那你就明白了。希望这能帮到你
答案 1 :(得分:0)
如果你有current_results = Results;
,它对我有用。
答案 2 :(得分:-2)
(int)(*current_Results)
不会将您在该位置找到的字节解释为您所期望的整数。它取在那里找到的一个角色并将其转换为int
。你的意思可能是*(int*)current_Results
。
但是你在这里做的所有事情可能都没有明确定义,因为你正试图访问int*
和任意对齐。不要那样做。