Как вычислить двумерный массив без ошибок valgrind? - PullRequest
1 голос
/ 15 марта 2019

Я работаю над школьным проектом, пытаясь создать двумерный массив на основе переменных.

int **wagner;
wagner = (int **)calloc((sizeofvstup1 + 1), sizeof(int));
for (int i = 0; i < (sizeofvstup1 + 1); i++) {
    wagner[i] =(int *)calloc((sizeofvstup2 + 1), sizeof(int));
}

Я использую calloc, чтобы получить 0 на каждом месте массива. Но Вальгринд продолжает говорить мне что-то вроде:

Неверная запись размера 8 в "wagner [i] ..."

sizeofvstup1 и sizeofvstup2 являются переменными длины массива. Как я должен использовать calloc здесь? Много раз пытался немного поменять строки, но так и не помог ...: /

Как должен выглядеть код для правильной работы?

Ответы [ 2 ]

3 голосов
/ 15 марта 2019

Вы не выделяете правильное количество размера для первого выделения:

wagner =(int **)calloc((sizeofvstup1+1),sizeof(int));

Здесь вы выделяете место для массива указателей, но вы передаете sizeof(int) для элементаразмер.Если int меньше, чем int *, вам не хватает места, и вы заканчиваете чтение / запись после конца массива.

Измените размер элемента выделения на sizeof(int *).Кроме того, не приводите возвращаемое значение calloc:

wagner = calloc((sizeofvstup1 + 1), sizeof(int *));
0 голосов
/ 15 марта 2019

Как уже упоминалось, код использует неправильный размер для 1-го распределения.

Чтобы никогда больше не думать о том, какой размер использовать при распределении, есть простой трюк:

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

int **wagner;
wagner = calloc(sizeofvstup1 + 1, sizeof *wagner);
for (size_t = 0; i < (sizeofvstup1 + 1); ++i) {
    wagner[i] = calloc(sizeofvstup2 + 1, sizeof *wagner[i]);
}

(все другие изменения вкод не имеет отношения к этой «уловке»)

Таким образом, код может даже пережить изменение с

int ** wagner;

, скажем,

double ** wagner;

без любых модификаций.

...