2013-09-26 3 views
1
#include<stdio.h> 

void printS(char []); 

int main(){ 
    char str[]="The C Programming Language"; 
    printf("%d \n",sizeof(str)); //output=27 
    printS(str); 
} 

void printS(char s[]){ 
    printf("%d \n",sizeof(s)); //output=4 
} 

Почему этот аномальный выходПочему sizeof() массив char иногда sizeof (void *), а иногда sizeof (массив)?

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

+1

В вводных классах нас часто учат, что массивы являются указателями, а указатели - массивами. Это неправда. Они похожи по-разному, но не то же самое. – abelenky

ответ

4

Когда вы передаете массив такой функции, как вы, она будет распадаться на указатель, и поэтому sizeof будет возвращать размер указателя, а не размер массива. C Faq's section on Arrays and Pointers - отличная справочная информация, и Question 6.4 охватывает эту проблему. Соответствующий раздел проекта стандарта C99 является раздел 6.3.2.1Lvalues, массивы и функции десигнаторами пункт который говорит (курсив мой):

исключением случаев, когда это операнд оператора SizeOf или одинарный & или является строковым литералом , используемым для инициализации массива, выражение , которое имеет тип '' array of type '', равно , преобразованное в выражение с типом '' указатель на тип '', который указывает на начальный элемент объект массива и не является значением lvalue.

Для того, чтобы получить длину строки в стиле C вы можете использовать strlen из string.h заголовочного файла.

3

Значение sizeof() - это размер одной переменной указанного типа. s на самом деле char*, поэтому sizeof(s) - 4 (на вашей 32-битной платформе). В main(), str рассматривается как массив символов, поэтому sizeof(str) - это размер массива. Обратите внимание, что длина «языка программирования C» равна 26, дополнительный один байт - для нулевого терминатора.

Чтобы получить длину s, используйте strlen(s). На этот раз нулевой ограничитель не учитывается. И не забудьте сделать #include <string.h> в начале.

0

C не имеет функции передачи значений массива. Массивы всегда передаются как указатели, когда вы объявляете параметр типа foo[], вы эффективно объявляете foo *.

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