Неясно, о чем вы говорите в связи с вызовами функции my_putstr(str)
, поскольку ни эта функция, ни какие-либо вызовы к ней не появляются в представленном вами коде.Тем не менее, я могу с уверенностью сказать, что ваш код для выделения памяти ошибочен и, по крайней мере, частично неверен.Учтите это:
char **map = malloc(nb_rows * sizeof(*map + 1));
.Какой именно смысл у + 1
там?Обратите внимание, что *map
имеет тип char *
, и, следовательно, *map + 1
.Оператор sizeof
вычисляет результат на основе типа его операнда, поэтому ваше выражение sizeof
вычисляет то же значение, что и sizeof(*map)
.Я предполагаю, что вы, вероятно, хотите
char **map = malloc((nb_rows + 1) * sizeof(*map));
, который резервирует место для nb_rows + 1
указателей.
Аналогично, это ...
map[i] = malloc(nb_cols * sizeof(**map + 1));
...не делает то, что вы, вероятно, намереваетесь.Чтобы зарезервировать место для разделителя для каждой строки, это было бы лучше записать как
map[i] = malloc((nb_cols + 1) * sizeof(**map));
.Но так как этот код относится только к строкам, а размер char
равен 1 по определению , я бы сам написал это так:
map[i] = malloc(nb_cols + 1);
У вас нетзарезервировало достаточно места для ваших данных, поэтому неудивительно, что вы видите повреждение памяти.
Обратите также внимание, что проверка на сбой выделения памяти (в этом случае malloc()
возвращает нулевой указатель) и соответствующая обработка, еслиэто важно для надежного кода.Возьмите в привычку делать это как рутину, хотя неспособность сделать это, вероятно, не способствует конкретной проблеме, о которой вы спрашивали.