Размер против Стрлен - PullRequest
       22

Размер против Стрлен

40 голосов
/ 30 марта 2012
#include "stdio.h"
#include "string.h"

main()
{

    char string[] = "october"; // october is 7 letters

    strcpy(string, "september"); // september is 9 letters

    printf("the size of %s is %d and the length is %d\n\n", string, sizeof(string), strlen(string));

    return 0;
}

Вывод:

размер сентября равен 8, а длина равна 9

Что-то не так с моим синтаксисом или как?

Ответы [ 4 ]

40 голосов
/ 30 марта 2012

sizeof и strlen() делают разные вещи. В этом случае ваша декларация

char string[] = "october";

совпадает с

char string[8] = "october";

чтобы компилятор мог определить, что размер string равен 8. Он делает это во время компиляции.

Однако strlen() подсчитывает количество символов в строке во время выполнения. Итак, после вызова strcpy(), string теперь содержит «сентябрь». strlen() считает символы и находит 9 из них. Обратите внимание, что вы не выделили достаточно места для string, чтобы провести «сентябрь». Это неопределенное поведение.

2 голосов
/ 30 марта 2012

Вывод правильный, потому что

размер строки первого оператора был выделен компилятором, который равен 7 + 1 (октябрь равен 7 байтам и 1 байт для нулевого терминатора во время компиляции)

Второе утверждение: вы копируете сентябрь (строка 9 байт в 8 байт);

там у вас есть размер сентября в 8 байтов (все же strlen() не будет работать в сентябре, у него нет нулевого символа)

1 голос
/ 30 марта 2012

Ваш целевой массив составляет 8 байтов (длина «октябрь» плюс \ 0), и вы хотите поместить в этот массив 9 символов.

man strcpy говорит: Если строка назначения strcpy () недостаточно велика, тогда может произойти все что угодно.

Пожалуйста, скажите мне, что вы действительно хотите сделать, потому что это пахнет очень долго

0 голосов
/ 30 марта 2012

Вы должны устранить проблему переполнения буфера в этом примере.Один из способов сделать это - использовать strncpy:

memset(string, 0, sizeof(string));
strncpy(string, "september", sizeof(string)-1);
...