我有一个结构,其中包含无符号整数的空间:
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
谢谢!
答案 0 :(得分:1)
问题是你正在做unsigned int *arr = cnt->arr
,它声明了一个无符号的int指针,并指向cnt-> arr。修改数组后,然后尝试重新设置数组 - 但是通过重新分配指针,您没有更改数组的内容;你只更改了指针。因此,您的cnt->arr = arr
行实际上并没有改变任何内容。然后,“unsigned int * arr”超出范围,因此指针被销毁,留下不可恢复的数据。
您需要临时复制数组,然后在该数组上执行操作,然后将其复制回来,或者(更简单的方法)只需使用arr
指针和 don 't 然后尝试cnt->arr = arr
- 无论如何都会实现这种效果