我试图创建一个数组并给它赋值虽然我能够正确地分配值,但我无法检索这些值,也不知道为什么。
这是代码片段的一部分。

  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)

记住,按偏移量递增指针不会增加原始内存地址,但这取决于指针类型。

09-25 21:27