3

如果我的字符串在这个程序中超过 9 个字符,我不应该得到一个错误吗?

// CString.c
// 2.22.11

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

main()
{
    char *aString = calloc(10, sizeof(char));

    if (aString == NULL)
    {
        return 1;
    }

    printf("PLEASE ENTER A WORD: ");
    scanf("%s", aString);

    printf("YOU TYPED IN: %s\n", aString);
    //printf("STRING LENGTH: %i\n", strlen(aString));
}

谢谢

布拉格曼

4

2 回答 2

5

您不会收到编译器错误,因为语法是正确的。不正确的是逻辑,并且您得到的是未定义的行为,因为您正在写入超过缓冲区末尾的内存。

为什么它是未定义的行为?好吧,您没有分配该内存,这意味着它不属于您-您正在侵入一个用警告胶带封闭的区域。考虑您的程序是否直接在缓冲区之后使用内存。您现在已经覆盖了该内存,因为您超出了缓冲区。

考虑使用这样的大小说明符:

scanf("%9s", aString);

所以你不会超出你的缓冲区。

于 2011-02-24T04:02:30.330 回答
1

是的,你有一个错误。最不幸的部分是你不知道它。您可能会在程序的稍后部分发生神秘崩溃(如果您幸运的话),或者当您的客户的律师来起诉您(如果您没有)时,您可能会知道它。

于 2011-02-24T04:15:53.513 回答