C, присваивание указателей структуры изменяет содержание правой стороны присваивания - PullRequest
0 голосов
/ 26 июня 2018

У меня есть следующие структуры:

typedef struct{
    char *name;
    int size;
    void *data;
} Struct1;
typedef struct st2{
    char *name;
    struct st2 **Struct2array;
    Struct1 **Struct1array;
    int Struct1_n;
    int Struct2_n;
} Struct2;

где двойные указатели в Struct2 используются в качестве динамических массивов указателей на другие Struct2 или Struct1. Данные в Struct1 используются в качестве динамического массива для хранения некоторых данных. Struct1_n и Struct2_n представляют количество элементов внутри соответствующих динамических массивов.

Когда я создаю переменную типа Struct1, я заполняю данные, бросая char * в void * и используя memcpy, чтобы скопировать его в данные. Если я затем приведу данные обратно в указатель на символ, я смогу вернуть содержимое, и они, как правило, совпадают. Однако по какой-то причине значения, на которые указывают данные в Struct1, меняются после следующей строки:

struct2pointer->Struct1array[struct2pointer->Struct1_n - 1] = struct1pointer;

Примеры:

printf("%d\n", *(char *)(struct1pointer->data));

дает значение 1-го байта struct1pointer-> data как -96 сразу после проблемной строки независимо от значения, которое оно напечатало непосредственно перед (которое было тем же самым memcpy-d в данных). если я добавляю 1 к указателю перед приведением его к указателю символа (2-й байт), он всегда дает 32, если я добавляю 2 (3-й байт), он всегда дает 96 и т. д.

Почему это происходит, когда struct1pointer находится справа от оператора присваивания и что можно сделать, чтобы это исправить?

EDIT:

Функции, в которых изменяется содержимое:

void struct2_addstruct1(Struct2 struct2pointer, Struct1 *struct1pointer){
    struct2->Struct1_n++;
    struct2pointer->Struct1array = realloc(struct2pointer->Struct1array, struct2->Struct1_n * sizeof(Struct1 *)); //edited to remove increment that was added on accident, isn't in the original code
    struct2pointer->Struct1array[struct2pointer->Struct1_n - 1] = struct1pointer;
}

Функция, которая создает Struct1:

void struct1_init(Struct1 *s, char *name, void *data, int size){
  s->name = malloc(strlen(name) + 1);
  strcpy(s->name, name);

  s->size = size;

  s->data = malloc(size);
  memcpy(s->data, data, size);
}

Вот как эта функция вызывается при создании struct1:

Struct1 *s;
struct1_init(s, name, data, size);

имя, данные и размер предоставляются извне, но не должны иметь ничего общего с проблемой.

1 Ответ

0 голосов
/ 26 июня 2018

Посмотрите на этот код:

Struct1 *s;
struct1_init(s, name, data, size);

Здесь s неинициализировано.

Однако в функции struct1_init предполагается, что указатель s уже указывает на Struct1.

Может быть, вы забыли malloc - как:

Struct1 *s = malloc(sizeof *s);
struct1_init(s, name, data, size);
...