Sizeof не возвращает истинный размер переменной в C - PullRequest
0 голосов
/ 06 декабря 2010

Рассмотрим следующий код

#include <stdio.h>

void print(char string[]){
 printf("%s:%d\n",string,sizeof(string));
}

int main(){
 char string[] = "Hello World";
 print(string);
}

и вывод

Hello World:4

Так что с этим не так?

Ответы [ 8 ]

9 голосов
/ 06 декабря 2010

Возвращает истинный размер «переменной» (на самом деле, параметр функции).Проблема в том, что это не тот тип, который вы считаете.

char string[] как параметр функции эквивалентен char* string.Вы получите результат 4, поскольку в вашей системе этот размер равен char*.

. Подробнее читайте здесь: http://c -faq.com / aryptr / index.HTML

3 голосов
/ 06 декабря 2010

Это размер указателя на символ, а не длина строки.

Используйте strlen из string.h, чтобы получить длину строки.

1 голос
/ 06 декабря 2010

За исключением случаев, когда он является операндом операторов sizeof или унарных & или является строковым литералом, используемым для инициализации другого массива в объявлении, выражение массива будет неявно преобразовано в свой тип ("decay")из "N-элементного массива T" в "указатель на T", и его значением будет адрес первого элемента в массиве ( n1256 , 6.3.2.1/3).

Объект string в main представляет собой массив из 12 элементов char.При вызове print в main тип выражения string преобразуется из char [12] в char *.Поэтому функция print получает значение указателя, а не массив.В контексте объявления параметров функции T a[] и T a[N] являются синонимами T *;обратите внимание, что это only true для объявлений параметров функции (это одна из самых больших ошибок IMO в C).

Таким образом, функция print работает с типом указателя, а не с типом массива, поэтому sizeof string возвращает размер char *, а не размер массива.

1 голос
/ 06 декабря 2010

массив изменится на указатель в качестве параметра функции в ANSI C.

1 голос
/ 06 декабря 2010

string - указатель, и его размер равен 4. Вам нужно strlen, вероятно.

0 голосов
/ 08 августа 2012

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

В случае std :: string функция-член string.length () вернет количество символов, хранящихся в строковом объекте.

0 голосов
/ 06 декабря 2010

Строка в c это просто массив символов. Это не обязательно NUL прекращается (хотя в вашем случае это так). Функция не может узнать, как долго передается ей строка - ей просто дается адрес строки в виде указателя.

"String" - это указатель, и на вашем компьютере (32-разрядном компьютере) для хранения указателя требуется 4 байта. Таким образом, sizeof (строка) составляет 4

0 голосов
/ 06 декабря 2010

http://www.java2s.com/Code/Cpp/Data-Type/StringSizeOf.htm посмотрите здесь, он имеет тот же результат, что и ваш ... и найдите, что вы делаете неправильно

...