2009-10-06 4 views
1

КодСоздание указатель на указатель с помощью таНос

char** p = (char **) malloc(sizeof(char **) * size); //Where size is some valid value. 
p[1] = (char*) malloc(sizeof(char) * 30); 

ли выше код нормально?

Мое понимание

p -> +---------+ 
    0 char* + -> {c,o,d,e,\0} 
    +---------+ 

    +---------+ 
    1 char* + -> {t,o,a,d,\0} //The assignment of these values is not shown in the code. 
    +---------+ 

Таким образом, мы должны вместо этого написать

char** p = (char **) malloc(sizeof(char *) * size); 

Я правильно?

И есть p [0] означает * (p + 1), где p + 1 укажет на «жабу», так что «жаба» будет возвращена?

+1

Вы отметили этот C++, но вы используете обозначение C. Если вы действительно используете C++, тогда вы должны использовать новый [], а не malloc, иначе перезапустите его как C. – Skizz

ответ

8

Как правило, значение «* -ness» вещи, которую вы принимаете размером внутри вызова malloc, должно быть на 1 '*' меньше, чем указатель, получающий память malloc'.

, например:

char * p = malloc(sizeof(char) * somesize); 

и

char ** p = malloc(sizeof(char *) * somesize); 
+0

+1, не только для слова «asteriskness» :) – avakar

2

Да, вы должны malloc()sizeof(char*), так как вы собираетесь хранить char* в массиве.

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

p[0] средства *(p + 0), а не (*p + 1). p[1] будет означать *(p + 1).

2

Да, вы в основном выделяете массив char * здесь размером size. sizeof(char *) действительно должен использоваться вместо sizeof(char **), но это практически ничего не изменит, поскольку указатель всегда имеет тот же размер.

p [0] означает * p, я предполагаю, что вы имели в виду, что p [1] означает * (p + 1), что является правильным.

+0

Извините, мой плохой. Я хотел написать p [1], но написал p [0]. – 2009-10-06 11:01:51

1

Вы правы. Это должно быть

char** p = (char**) malloc(sizeof(char*) * size); 

Что касается вашего последнего вопроса, я не совсем понимаю. p [0] означает * (p + 0). p [1] означает * (p + 1).

2

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

Но p[0] указывает на буфер, содержащий «код», в то время как p[1] указывает на буфер, содержащий «жабу». Код выделяет массив указателей, а затем заполняет элемент второй, оставляя первый неинициализированный.

1

Да, вы должны написать

char** p = (char **) malloc(sizeof(char *) * size); 

Но нет, p[0] означает *(p + 0) где p+0 укажут "code" так "code" будут возвращены.

Если вы хотите «жабу», используйте p[1], что означает *(p + 1).

1

Я всегда делаю это так:

#include <stdlib.h> 
pointer = malloc(ELEMENTS * sizeof *pointer); 
/* check if pointer is NULL */ 

В вашем случае это становится:

#include <stdlib.h> 
char** p = malloc(sizeof *p * size); //Where size is some valid value. 
/* check if p is NULL */ 
p[1] = malloc(sizeof *(p[1]) * 30); 
/* check if p[1] is NULL */ 

Примечание: В C, возвращаемое значение таНос не должен быть брошен! void * вполне допустимо назначать любому другому типу указателя. В C++ это может быть иначе.

Смежные вопросы