2016-09-12 1 views
0

Я пытаюсь читать в пользовательском вводе, а затем анализировать его на токены с помощью strtok(). Вот мой код:Почему realloc не обновляет размер моего массива?

int main(){ 
char argv[200]; 
char** tokenList = NULL; 

printf("shell>>"); 
scanf("%[^\n]%*c", argv); 
int len = 0; 
char* line = strtok(argv, " "); 
while (line != NULL) { 
    printf("%s\n", line); 
    printf("%lu\n", sizeof(tokenList) + (sizeof(char*) * (len+1))); 
    tokenList = realloc(tokenList, sizeof(tokenList) + (sizeof(char*) * (len+1))); 
    printf("%lu\n", sizeof(tokenList)); 
    char* p = malloc(sizeof(char) * (sizeof(line) + 1)); 
    p=line; 
    tokenList[len] = p; 
    len++; 
    line = strtok(NULL, " "); 
    } 

Три заявления печати является для моих целей отладки, и я не могу понять, что происходит. Когда я запускаю консоль и введите «а б» мой вывод следующий:

a 
16 
8 
b 
24 
8 
c 
32 
8 

Почему размер моего массива tokenList не получает обновленный по зову перераспределить?

+1

Указатель не является массивом! И это не так, как C работает. Нет массивов с динамической длиной в C. Все типы статически объявляются. 'realloc' просто изменяет размер блока памяти (например,' malloc' выделяет его). – Olaf

+0

'sizeof()' работает только во время компиляции, а не во время выполнения. Он определяет размер данного объекта/переменной, а не то, на что он указывает. –

+1

@Olaf: «Нет массивов с динамической длиной в C.» Есть, конечно, VLA (массивы с переменной длиной), но размер каждого объекта VLA фиксируется во время выполнения, когда он создан. Этот каламбур не связан с тем, о чем спрашивает ОП. –

ответ

1

Вы используете оператор sizeof на указателе. Это дает размер в байтах указателя, а не на указанную длину данных. Легко представить, почему, поскольку tokenList - это просто переменная, которая хранит адрес, вы получаете размер переменной, а не то, что указывает переменная.

В C массивы, выделенные на куче, не знают своего размера, разработчик должен позаботиться о том, чтобы знать его и хранить/обновлять, когда это необходимо.

Единственный случай, когда вы можете использовать напрямую sizeof - это когда массив объявлен статическим или локальным хранилищем (а не в куче). В этом случае sizeof возвращает общую длину в байтах массива, так что вы можете сделать sizeof(array)/sizeof(array[0]), чтобы получить счетчик элементов.

+2

Джек, это не «исключение». Он просто вычисляет размер в байтах переданного объекта/переменной. –

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

  • Нет связанных вопросов^_^