scanf 内存分配错误

memory allocation error with scanf

我有这个简单的代码,但不知道如何为 scanf 分配内存

char* string= (char*) malloc (sizeof(char));
printf("insert string: \n");
scanf("%s", string);
free(string);

无论我的字符串有多少个字符,都是错误。我想为 char* 使用 malloc,为 scanf 设置内存的任何方式。

你只是请求1个字节。如果你想存储的不仅仅是字符串中的 0 终止符,你需要分配更多:

char* string= malloc (256); //256 bytes, arbitrary value...

我删除了:

我还建议使用 fgets() 而不是 scanf() 来防止缓冲区溢出。通过在格式字符串中指定长度,可以对 scanf() 完成相同的操作。但我个人更喜欢在必要时使用 fgets() and parsing using sscanf()

尝试

  char buf[256];
  scanf( "%s" , buf);

删除你的 malloc。 您正在为可能是可变大小的字符串数组分配一小块内存。默认情况下,一个数组只是一个指向 buf[0] 的指针,这是字符串将给它的内容。您需要一个缓冲区来捕获初始读取,然后分配适当的内存。

之后你可以做 string = length(buf) * sizeof(char) <- 伪代码

分配正确的字符串长度。

正如@Blue Moon 正确指出的那样,您只是分配内存来存储一个字符,而单个字符唯一可以存储的字符串是空字符串或没有字符的字符串。在 C 中,所有字符串都以空字符结尾,您分配的 1 个字节的内存只能容纳一个空字符,即 '\0'

为了在字符串中存储更多的字符,比如一百个字符,您可以执行以下操作:

#define MAX_STRING_SIZE 102

char* string= (char*) malloc (sizeof(char) * MAX_STRING_SIZE);
memset(string, '[=10=]', MAX_STRING_SIZE);
printf("Insert string: \n");
scanf("%101s", string);
if (strlen(string) == (MAX_STRING_SIZE - 1))
{
    printf("The user entered a string larger than 100 characters!");
    free(string);
    /****Error handling***/
}

/*****Do something with string****/
free(string)

上面的代码片段是一个很好的小技巧,可以判断用户输入的字符数是否有效。如果您希望用户最多输入 100 个字符,并且您的程序在理想情况下总是 运行(用户一直在听您说话并且从不输入超过 100 个字符),您只需要一个额外的字节存储空字符。因此,101 个字符需要 space。但是您可以为另一个字符添加 space,并分配 102 个字节,以找出用户输入超过 100 个字符的字符串的情况。

工作原理:假设用户输入了 100 多个字符。 scanf 函数最多可以读取 101 个字符。所以,我们可以使用strlen函数来判断用户输入的字符数是否等于101,这样可以帮助我们验证输入的字符串。