используя malloc для двойного указателя - PullRequest
0 голосов
/ 13 декабря 2018
char **three = (char**)malloc(sizeof(char*));

char**, используется тип указателя символа.и char** означает, что я разыменовываю указатель на символ.а что касается sizeof(char*), я использую указатель char размером 8 байт.

Не понимаю ли я это?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Итак, код:

char **three = ( char** )malloc( sizeof( char* ) );

Выделяет массив указателей на символ, но только с одним элементом.Переменная three является указателем на указатель на символ.Почти так же, как:

char *three[1];

Обычно (как указывает @paxdiablo) было бы более привычно выделять количество указателей:

int line_count = 66;
char **three = ( char** )malloc( line_count * sizeof( char* ) );

После выделения это может бытьиспользуется с обозначением массива:

three[0] = "The Owl and the Pussy-cat went to sea";
three[1] = "In a beautiful pea-green boat,";
three[2] = "They took some honey, and plenty of money,";
three[3] = "Wrapped up in a five-pound note."

В char** нет ничего особенного, каждая программа на C / C ++ получает его в качестве argv.

Как программист, вы нена самом деле вы не знаете, что ваш указатель имеет размер 8 , вы знаете, что указатель будет иметь размер некоторый .Вот тут и приходит sizeof( char* ). Во время компиляции компилятор заменяет это на реальное значение.Таким образом, когда архитектура будет 16, 32 или 64-битной (или, возможно, 128-битной в будущем), код все равно будет компилироваться нормально.

0 голосов
/ 13 декабря 2018

Давайте посмотрим, сможем ли мы разобрать это:

char **three = (char**)malloc(sizeof(char*));
[     1    ][5][  4   ][ 3  ] [    2      ]
  1. Создать переменную three типа char **, указатель на char * (часто это "строка" вC).
  2. Используйте размер char* для перехода к malloc.
  3. Используйте malloc для выделения такого количества байтов.
  4. Приведите возвращаемое значениеот malloc, void* до char**.
  5. . Присвойте это значение three.

Итак, с точки зрения того, где, по вашему мнению, ваше недопонимание заключается:

  • Не приводите возвращаемое значение malloc или realloc в C. C вполне способен неявно приводить void* к другим типам указателей, и выполнение этого явно может скрыть некоторые тонкие ошибки.
  • Здесь не происходит разыменование.(Неразумный) приведение - это именно то, что говорит компилятору, что вы хотите обработать выражение одного типа, как если бы оно было другого типа.
  • Вы фактически выделили массив char* переменных и этот размер массиваэто один.Таким образом, если не вызывать realloc для него в какой-то момент, его использование ограничено (если только он вам не нужен, чтобы выжить в текущей области, возможно, вам лучше использовать локальную переменную, а не выделенный одноэлементный массив).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...