#c #string #pointers
#c #строка #указатели
Вопрос:
char **init(int n) {
char **resu<
result = malloc(n * sizeof(char));
return resu<
}
Мне нужна помощь в понимании того, является ли 3-я строка ошибкой или нет. Вызов malloc() создаст N непрерывных блоков в памяти в куче, каждый из которых достаточно большой, чтобы хранить один символ, и он вернет пустой ptr (базовый адрес массива). Однако результатом является указатель на указатель, поэтому ему нужно будет сохранить адрес другого указателя, чего здесь нет?
Комментарии:
1. Почему результат является указателем на указатель?
2. @merlin2011 Если вы видите, что в методе мы объявили переменную result как двойной указатель, который является указателем на указатель.
3. Скорее всего, это ошибка, но я не понимаю ваших рассуждений.
4. @aDabOfRanch, объявление
result
char**
как средство,result
синтаксически являющееся achar**
, но это не означает, что оно семантически achar**
. Возвращаемое значениеmalloc
представляет собой линейный блок памяти, а не массив указателей.5. Один вызов
malloc
создает один непрерывный блок хранилища
Ответ №1:
Может быть, вы хотите сделать что-то вроде этого:
char *init(unsigned int n) {
char *resu<
/* allocate the memory */
result = malloc(n * sizeof(char));
return resu<
}
это позволит выделить память для хранения n непрерывных символов.
вы могли бы сократить код до:
char *init(int n) {
return malloc(n * sizeof(char));
}
или вместо вызова этой функции вы могли бы просто напрямую выполнить:
malloc(n * sizeof(char));
или вы могли бы создать макрос
#define INIT_CHAR_ARR(n) malloc((n) * sizeof(char))
если вам нужны n непрерывных символьных указателей:
malloc(n * sizeof(char*))
Это помогло бы нам помочь вам, если бы вы объяснили свою конечную цель, возможно, есть лучший способ сделать то, что вы делаете.
Комментарии:
1.
sizeof (char)
1
по определению.2. Спасибо за информацию. Рекомендуется использовать a
sizeof()
при использованииmalloc()
, чтобы четко указать, для чего используется возвращаемое значение и почему мы выделяем такое количество байтов.malloc(n)
тогда это менее информативно для программистаmalloc(n*sizeof(char))
, последнее помогает объяснить, что мы используем это как массив из n символов.3. Я категорически не согласен. Если вы обернете его в макрос (или функцию), имя уже предоставляет эту информацию. Если вы вызываете malloc напрямую для инициализации переменной, вы можете просто сделать
char *result = malloc(n * sizeof *result);
(что правильно независимо от типаresult
). Ни в том, ни в другом случае вам не нужно писатьsizeof (char)
.4. Да, есть много способов сделать это, используя
sizeof()
ключ is в обоих. Я живу в мире встроенных систем, где довольно стандартно указывать тип данныхsizeof()
, а не имя переменной (вероятно, связано со строгим отслеживанием памяти), но все работает, пока вы сохраняете его согласованным