2016-11-27 4 views
0

Я пытаюсь найти длину массива указателей. Вот мой код:c, Finding length of pointer array

char **histargv[histsize]; 
histargv[hist] = (char**)malloc(sizeof(char *)*arg); 

переменная агд не является постоянным. Каждый индекс массива histargv имеет другое значение arg. Итак, как я могу найти значение arg для каждого индекса?

Благодаря

+3

Возможный дубликат [Как найти «sizeof» (указатель, указывающий на массив)?] (Http://stackoverflow.com/questions/492384/how-to-find-the-sizeofa-pointer-pointing -to-an-array) –

+2

Вы не можете найти длину динамически распределенного массива только со своего указателя. – qxz

ответ

0

Если указатели на строки, то вы можете выяснить длину строки (а не размер блока памяти) с помощью strlen. То есть с:

for (size_t i = 0; i < 100; ++i) { 
    histargv[i] = read_some_string_somehow_and_return_in_new_buffer(); 
} 

можно напечатать строку, включая их длину, как это:

for (size_t i = 0; i < 100; ++i) { 
    printf("%3zu %zu %s\n", i, strlen(histargv[i]), histargv[i]); 
} 

Если это не строки, то вы должны следовать по ссылке в Эле Sadoffs комментария.

+0

Вы также можете найти длину строки без 'strlen'. Вы также можете использовать 'int i;' и 'for (i = 0; * (c + i)! = '\ 0'; i ++);', а затем 'i' будет длиной строки (если она равна нулю termigned и 'char * c' - это строка). –

+0

Есть много способов, да. Но 'strlen', возможно, намного быстрее, потому что он может использовать зависящие от системы оптимизации, которые ваш цикл может не использовать. Также вы можете написать 'c [i]' вместо '* (c + i)', вы можете полностью удалить '! = '\ 0'', вы можете использовать' size_t' как тип данных для 'i' вместо' int' и and and;) –