Доступ к массиву структур без знака - PullRequest
0 голосов
/ 30 апреля 2011

У меня есть структура, в которой есть место для беззнаковых целых:

typedef struct {
    unsigned int *arr;
} Contents;

Когда я выделяю память:

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

Позже я получаю ее путем разыменования, передавая указательСодержание и выполнение:

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 Ответ

1 голос
/ 30 апреля 2011

Проблема в том, что вы делаете unsigned int *arr = cnt->arr, который объявляет беззнаковый указатель int и указывает на cnt-> arr.После того, как вы измените массив, вы затем попытаетесь переустановить массив - но, переназначив указатели, вы не изменили содержимое массива;Вы только изменили указатели .Таким образом, ваша строка cnt->arr = arr фактически ничего не меняет.Затем «unsigned int * arr» выходит из области видимости, и, таким образом, указатель уничтожается, оставляя вас с невосстановимыми данными.

Вместо этого вам нужно будет скопировать массив во временное пространство и выполнить с ним операциивместо массива, а затем скопируйте его обратно, ИЛИ (более простой метод) просто используйте указатель arr и не , затем попробуйте cnt->arr = arr - этот эффект все равно будет достигнут

...