Распределение памяти для 2D массива в C - PullRequest
0 голосов
/ 08 января 2012

Я пишу многопоточную программу на C, и у меня ошибка. У меня есть двумерный массив array worker_table, объявленный глобально как:

int **worker_table;

И выделяется в основном следующим образом:

worker_table        = (int**) calloc(number_of_workers*2,(sizeof(int)));

Это рабочая функция:

    void *Worker(void *worker_id)
    {

my_id = (int)worker_id;    //id of the worker
printf("Line 231\n");
printf("My id is %d\n",my_id);
my_customer = worker_table[my_id][1];//line 233
printf("Line 234\n");
int my id;

Ошибка возникает до строки 234, я думаю, что неправильно в строке 233, но я не могу понять, что это такое.

Ответы [ 2 ]

4 голосов
/ 08 января 2012

Ваше распределение неверно.Это должно быть так:

worker_table = calloc(number_of_workers,(sizeof(int*)));
for(int i = 0; i < 2; ++i)
{
   worker_table[i] = calloc(2, sizeof(int));
}

И процедура освобождения должна быть:

for(int i = 0; i < 2; ++i)
{
    free(worker_table[i]);
}
free(worker_table);

Я предлагаю вам прочитать хорошую книгу на C

1 голос
/ 08 января 2012

Вы выделили только одно измерение вашего двумерного массива.

Вот как вы можете выделить второе измерение:

worker_table = malloc(number_of_workers * (sizeof(int*)));
for(size_t i = 0; i < 2; ++i)
  worker_table[i] = calloc(2, sizeof(int));

Или получить к нему доступ с помощью умножения:

int* worker_table = calloc(number_of_workers*2,(sizeof(int)));
my_customer = worker_table[x + y * number_of_workers];
...