2016-07-06 2 views
-1
char a[255]; 
void test(char* a){ 
    printf("%d %d %d \n",sizeof(a),sizeof(*a),sizeof(&a)); 
} 

все они не получают действительный размер переменной 'a';Как я могу получить размер массива символов в функции (язык c)?

+1

Вы не можете, массив переходит в указатель при передаче другой функции. Вы можете получить размер только в пределах области объявления (функция-область в случае локального массива и область-файл в случае глобального массива). –

+0

strlen (a); возвращает размер строки, но не весь массив –

+0

См. [Как найти «sizeof» (указатель, указывающий на массив)?] (http://stackoverflow.com/questions/492384/how-to-find -The-sizeofa-указатель указывает к ан-массив). – Lundin

ответ

3

Вы не можете. Вам придется передать размер в качестве дополнительного параметра. Вероятно, тип unsigned int, потому что размер не может быть отрицательным.

void test(char* a, unsigned int size) 
{ 
    // ... 
} 

Хотя это тот же конечный результат, было бы еще лучше, чтобы сделать свой второй аргумент size_t, потому что это условность.

void test(char* a, size_t size) 
{ 
    // ... 
} 
+4

Или 'size_t', используется практически во всех стандартных библиотеках для описания величины последовательности объектов. – WhozCraig

+0

@WhozCraig Хороший звонок. – nvoigt

3

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

char a[255]; 
void test(char* a, size_t num_elem){ 
    /* do smth */ 
} 

int main() { 
    test(a, sizeof a/sizeof a[0]); 
    return 0; 
} 

И sizeof a/sizeof a[0] дает ряд элементов внутри массива, обратите внимание, что этот трюк не будет правильно работать с указателями, но только с массивами.

+0

Стоит отметить, что трюк 'sizeof a/sizeof [0]' работает только в 'main', поскольку' a' имеет тип массива, тогда как он не работает в 'test', поскольку глобальная' a 'затеняется параметром 'a', который имеет тип указателя. – majk

+0

Да, этот трюк должен применяться только к массивам, а не к указателям. – Sergio

+1

Более того, он «работает» в обоих местах, но после преобразования в указатель на тип (например, в случае с параметром) он, безусловно, не «работает» так, как вы этого хотите. В таких случаях это было проклятием многих инженеров, так как * оба * случая будут компилироваться без ошибок или даже предупреждения. – WhozCraig

0

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