Как выделить память для строкового массива в C - malloc error - PullRequest
0 голосов
/ 12 мая 2019

Проблема: я хочу выделить память для элементов массива строк фиксированного размера, однако в 75% случаев происходит сбой.

Это 25% времени, в течение которого моя программа работает без сбоев, но это ошибка, с которой я не сталкивался раньше

#define PACKAGE_COUNT 60
#define MAX_COUNT     5

const char *colors[] = { "blue", "red", "yellow", "purple", "orange" };

char **generatePackage() {


  char **generatedPackage = malloc(PACKAGE_COUNT);
  int randomIndex         = 0;

  for (int i = 0; i <= PACKAGE_COUNT; ++i) {

    randomIndex         = rand() / (RAND_MAX / MAX_COUNT + 1);
    generatedPackage[i] = malloc(sizeof(char) * sizeof(colors[randomIndex])); 
    // ERROR

    strcpy((generatedPackage[i]), colors[randomIndex]);

    // printf("generatePackage - %d: %s \n", i + 1, generatedPackage[i]);
  }

  return generatedPackage;
}

enter image description here enter image description here enter image description here

1 Ответ

5 голосов
/ 12 мая 2019

Вы не учли тот факт, что размер указателя не один.Следовательно, была выделена только часть размера.Таким образом, некоторым указателям было недостаточно памяти для выделения, что приводило к аварийному завершению программы только при доступе к одному из них.

#define PACKAGE_COUNT 60
#define MAX_COUNT     5

const char *colors[] = { "blue", "red", "yellow", "purple", "orange" };

char **generatePackage() {
  char **generatedPackage = malloc(PACKAGE_COUNT * sizeof(char*)); // The size of a pointer is not one, so this a multiplicative factor must be applied
  int randomIndex         = 0;

  for (int i = 0; i < PACKAGE_COUNT; ++i) { // the upper bound is i < PACKAGE_COUNT, not i <= PACKAGE_COUNT

    randomIndex         = rand() / (RAND_MAX / MAX_COUNT + 1);
    generatedPackage[i] = malloc(sizeof(char) * (strlen(colors[randomIndex]) + 1)); // You probably want to allocate enough space for the string, rather than enough space for the pointer, so you must use strlen

    strcpy((generatedPackage[i]), colors[randomIndex]);

    // printf("generatePackage - %d: %s \n", i + 1, generatedPackage[i]);
  }

  return generatedPackage;
}
...