char a[255];
void test(char* a){
printf("%d %d %d \n",sizeof(a),sizeof(*a),sizeof(&a));
}
все они не получают действительный размер переменной 'a';Как я могу получить размер массива символов в функции (язык c)?
char a[255];
void test(char* a){
printf("%d %d %d \n",sizeof(a),sizeof(*a),sizeof(&a));
}
все они не получают действительный размер переменной 'a';Как я могу получить размер массива символов в функции (язык c)?
Вы не можете. Вам придется передать размер в качестве дополнительного параметра. Вероятно, тип unsigned int
, потому что размер не может быть отрицательным.
void test(char* a, unsigned int size)
{
// ...
}
Хотя это тот же конечный результат, было бы еще лучше, чтобы сделать свой второй аргумент size_t, потому что это условность.
void test(char* a, size_t size)
{
// ...
}
Вы должны передать его явно вместе с указателем на первый элемент.
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]
дает ряд элементов внутри массива, обратите внимание, что этот трюк не будет правильно работать с указателями, но только с массивами.
Стоит отметить, что трюк 'sizeof a/sizeof [0]' работает только в 'main', поскольку' a' имеет тип массива, тогда как он не работает в 'test', поскольку глобальная' a 'затеняется параметром 'a', который имеет тип указателя. – majk
Да, этот трюк должен применяться только к массивам, а не к указателям. – Sergio
Более того, он «работает» в обоих местах, но после преобразования в указатель на тип (например, в случае с параметром) он, безусловно, не «работает» так, как вы этого хотите. В таких случаях это было проклятием многих инженеров, так как * оба * случая будут компилироваться без ошибок или даже предупреждения. – WhozCraig
Вы не можете этого сделать. a
имеет тип char*
, и он не имеет связанного с ним размера. Вот почему большинство стандартных методов библиотеки для вывода в буфер имеют дополнительный параметр для задания размера буфера (см. strncpy).
Вы не можете, массив переходит в указатель при передаче другой функции. Вы можете получить размер только в пределах области объявления (функция-область в случае локального массива и область-файл в случае глобального массива). –
strlen (a); возвращает размер строки, но не весь массив –
См. [Как найти «sizeof» (указатель, указывающий на массив)?] (http://stackoverflow.com/questions/492384/how-to-find -The-sizeofa-указатель указывает к ан-массив). – Lundin