Выражение Calloc выше делает то же самое, что и два выражения malloc в программе ниже.
Нет, не будет.Если оставить в стороне тот факт, что ваш первый malloc()
не выделяет достаточно места даже для одного указателя, а тем более двух, вы, похоже, не понимаете разницу между массивами и указателями.
Функция Calloc простоинициализировать два массива каждого размера 20 байт.Но все же я не понимаю, почему это не работает.
Это действительно разумный способ описать эффект этого вызова calloc()
(когда он успешен).Более полное описание может состоять в том, что он выделяет и обнуляет пространство для массива из двух массивов по 20 char
с.Но это не то же самое, что вы делаете со своими тремя malloc()
вызовами в примере кода.
Вы ошибаетесь, когда назначаете результат вашего calloc()
переменной указателятипа, который не соответствует.char **
- указатель на char *
.Указатель на указатель может в некоторых случаях быть элементом массива таких указателей.Но массивы - это совсем не то же самое, что указатели, и, следовательно, массивы массивов - это не то же самое, что массивы указателей.
Вполне возможно, вы захотите этого, вместо этого:
char (*ptr)[20] = calloc(2 * sizeof(char) * 20);
или, лучше, это:
char (*ptr)[20] = calloc(2 * sizeof(*ptr));
В любом случае, ptr
объявляется как указатель на массив из 20 char
, и достаточно места зарезервировано для массива, на который указываетпервый элемент массива из двух таких.Полученный указатель можно использовать всеми способами, которые вы демонстрируете в своем вопросе, за исключением того, что вы должны free()
только один указатель - других нет.