访问unsigned int的struct数组

时间:2011-04-30 05:58:50

标签: c pointers c99

我有一个结构,其中包含无符号整数的空间:

typedef struct {
    unsigned int *arr;
} Contents;

当我分配内存时:

Contents *Allocator()
{
    Contents *cnt = malloc(sizeof(Contents));
    cnt->arr = calloc(1, sizeof(unsigned int));
}

我稍后通过传入一个指向Contents的指针并执行:

来解除引用它
void SomeFunction(Contents *cnt)
{
   unsigned int * arr = cnt->arr;
   arr[0] >>= 1; // In the future 0 will be replaced by a loop over the array items
   cnt->arr = arr;
 }

退出函数后,cnt-> arr变空。我必须做一个memcpy吗?我不明白结构是如何布局的?据我了解

cnt->arr = (*cnt).arr

谢谢!

1 个答案:

答案 0 :(得分:1)

问题是你正在做unsigned int *arr = cnt->arr,它声明了一个无符号的int指针,并指向cnt-> arr。修改数组后,然后尝试重新设置数组 - 但是通过重新分配指针,您没有更改数组的内容;你只更改了指针。因此,您的cnt->arr = arr行实际上并没有改变任何内容。然后,“unsigned int * arr”超出范围,因此指针被销毁,留下不可恢复的数据。

您需要临时复制数组,然后在该数组上执行操作,然后将其复制回来,或者(更简单的方法)只需使用arr指针和 don 't 然后尝试cnt->arr = arr - 无论如何都会实现这种效果