Распределение массива в структуре - PullRequest
0 голосов
/ 10 марта 2019

У меня есть следующий код, и мне нужно выделить память для char data[]. Я пробовал много вещей, но это все еще не работает Кто-нибудь может мне помочь? Я знаю, что мой malloc не будет ничего выделять для данных, но как это исправить.

Я хотел бы, чтобы данные распределялись следующим образом:

img->data = malloc(sizeof(char)*(img->xsize * img->ysize * 3));

Не могу изменить структуру:

struct ppm {
    unsigned xsize;
    unsigned ysize;
    char data[]; 
};
struct ppm *img = malloc(sizeof(struct ppm));
if (!img) {
     fprintf(stderr, "Chyba alokace pameti.\n");
     exit(1);
}
if (fscanf(fp, "%x %x", &img->xsize, &img->ysize) != 2) {
     fprintf(stderr, "Spatna velikost obrazku '%s'\n", filename);
     exit(1);
}
if (fread(img->data, 3 * img->xsize, img->ysize, fp)) 
     fprintf(stderr, "Nepodarilo se nacist pixely z '%s'\n", filename);
     exit(1);
}

1 Ответ

1 голос
/ 10 марта 2019

(обратите внимание, что в вашем коде отсутствует '{')

в

struct ppm {
    unsigned xsize;
    unsigned ysize;
    char data[]; 
};

struct ppm *img = malloc(sizeof(struct ppm));

у вас нет места для помещения чего-либо в данные , поэтому fread(img->data, 3 * img->xsize, img->ysize, fp) запишет из выделенного блока

Используйте realloc , чтобы увеличить размер img , когда у вас есть размеры, выполните

img = realloc(img, sizeof(ppm) + 3 * img->xsize * img->ysize);

до

if (fread(img->data, 3 * img->xsize, img->ysize, fp)) 

Предупреждение:

  • вы делаете fread сразу после fscanf , что означает, что начало данных находится сразу после конца второго числа, если у вас есть, например, символ новой строки после второго числа, этот символ новой строки является частью данных, считанных fread
  • если результат fread не равен 0, вы считаете это ошибкой, возможно, вы хотели сделать if (fread(...) != 3 * img->xsize * img->ysize). Обратите внимание, что для проверки результата fread не 0 недостаточно, чтобы быть уверенным, что вы прочитали все, потому что, возможно, вы не читали все, даже если это не ошибка
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...