Вызов malloc и сохранение возвращаемого значения в двойном указателе?

#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 синтаксически являющееся a char** , но это не означает, что оно семантически a char** . Возвращаемое значение 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() , а не имя переменной (вероятно, связано со строгим отслеживанием памяти), но все работает, пока вы сохраняете его согласованным