Присвоение массива struct терпит неудачу - PullRequest
0 голосов
/ 26 мая 2018

Этот простой код падает (ошибка сегментации), и я не понимаю, почему.Похоже, что эта операция [] не работает должным образом с массивом структур.Может быть, кто-то знает причину этого странного поведения.

#include <stdio.h>
#include <stdlib.h> 
#include <string.h>

#define SIZE 3

typedef struct{
  int a;
  char * b;
}qwe;

void foo ( qwe **out){
  int i;

  *out = (qwe*)malloc(SIZE*sizeof(qwe));

  for (i=0;i<SIZE;i++){
    out[i]->a = i;
    out[i]->b = strdup("Hello");
  }
}

int main() {
  int i = 0;
  qwe *p = NULL;

  foo(&p);

  for (i=0;i<SIZE;i++)      
    printf("Int: %d, str: %s \n",p[i].a , p[i].b);

}

1 Ответ

0 голосов
/ 26 мая 2018

С объявлением qwe *p = NULL; вы объявляете не массив указателей, а фактический struct.Но в foo вы разыменовываете содержимое массива как указатель, и это неверно.Ваш подход можно переписать так:

for (int i = 0; i<SIZE; i++) {
    (*out)[i].a = i;
    (*out)[i].b = _strdup("Hello");
}

Другой подход, который делает разыменование лучше читаемым (на мой взгляд), заключается в передаче ссылки на массив:

void foo1(qwe *& out) {
    out = (qwe*)malloc(SIZE * sizeof(qwe));
    for (int i = 0; i<SIZE; i++) {
        out[i].a = i;
        out[i].b = _strdup("Hello");
    }
}
...