44
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char string[] = "october"; // 7 letters

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

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

    return 0;
}

输出:

$ ./a.out
the size of september is 8 and the length is 9

我的语法有问题还是什么?

4

4 回答 4

41

sizeofstrlen()做不同的事情。在这种情况下,您的声明

char string[] = "october";

是相同的

char string[8] = "october";

所以编译器可以知道 的大小string是 8。它在编译时执行此操作。

但是,strlen()在运行时计算字符串中的字符数。所以,在你打电话之后strcpy()string现在包含“九月”。 strlen()计算字符并找到其中的 9 个。请注意,您没有分配足够的空间string来容纳“九月”。这是未定义的行为。

于 2012-03-30T04:59:26.673 回答
2

输出是正确的,因为

编译器分配的第一个语句字符串大小为 7+1(10 月为 7 个字节,编译时空终止符为 1 个字节)

第二条语句:您正在复制九月(9 字节到 8 字节字符串);

在那里你得到了 9 月的大小为 8 个字节(9 月仍然strlen()不能工作,它没有空字符)

于 2012-03-30T05:05:49.983 回答
1

您的目标数组是 8 个字节(“october”的长度加上 \0),并且您想在该数组中放入 9 个字符。

man strcpy说:如果 strcpy() 的目标字符串不够大,那么任何事情都可能发生。

请告诉我你真正想做什么,因为这闻起来很臭

于 2012-03-30T04:57:06.317 回答
-1

您必须在此示例中消除缓冲区溢出问题。一种方法是使用strncpy

memset(string, 0, sizeof(string));
strncpy(string, "september", sizeof(string)-1);
于 2012-03-30T08:24:42.547 回答