如何在C中使用calloc()?

nam*_*run 3 c string gcc strlen calloc

如果我的字符串在此程序中超过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));
}
Run Code Online (Sandbox Code Playgroud)

谢谢

blargman

Mar*_*lon 6

您没有收到编译器错误,因为语法是正确的.什么是不正确的逻辑,你得到的是未定义的行为,因为你写入缓冲区末尾的内存.

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

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

scanf("%9s", aString);
Run Code Online (Sandbox Code Playgroud)

所以你不要超过你的缓冲区.

  • @blargman:**未定义的行为意味着******任何*****都可能发生**.这包括允许您的程序工作.它还包括使计算机崩溃,导致手机爆炸,停止旋转地球并使希特勒恢复生机.换句话说,"未定义的行为"意味着"无法保证这将以您希望的方式运行." 您不能依赖未定义的行为来始终如一地为您提供预期的行为. (2认同)