我试图创建一个数组并给它赋值虽然我能够正确地分配值,但我无法检索这些值,也不知道为什么。
这是代码片段的一部分。
void *arr = (void *)(malloc(sizeof(void *) * 5));
int i = 0;
for(i = 0; i < 5; i++) {
*(int *)(arr+i) = initial[i];
printf("Value of array: %d\n", *(int *)(arr+i));
}
for(i = 0; i < 5; i++) {
printf("Pushing: %d\n", *(int *)(arr+i));
DArray_push(result, (arr+i));
}
程序的输出是
Value of array: 4
Value of array: 1
Value of array: 3
Value of array: 2
Value of array: 0
Pushing: 33751300
Pushing: 131841
Pushing: 515
Pushing: 2
Pushing: 0
为什么我的程序能够正确地接受值,但是当我稍后尝试检索垃圾值时,它会输出垃圾值?
最佳答案
Pushing: 33751300 = 4 + 1 * 256 + 3 * 256 * 256 + 2 * 256 * 256 * 256
Pushing: 131841 = 1 + 3 * 256 + 2 * 256 * 256
Pushing: 515 = 3 + 2 * 256
Pushing: 2
Pushing: 0
这一部分已经错了,但是在大多数32位或64位编译器上仍然可以工作:
sizeof(void *)
。只是因为这至少相当于这些平台上的int
大小。*(int *)(arr+i)
这才是真正的问题。这没有访问下一个整数,而是访问了下一个可由void指针寻址的地址,该指针通常是一个字节访问下一个整数相当于:
*(int *)(arr + i*sizeof(int))
或者更容易阅读:
*( ((int *)arr) + i)
记住,按偏移量递增指针不会增加原始内存地址,但这取决于指针类型。