0

我发现这段代码运行良好。

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




int main(int argc,char *argv[])
{
    char* s;        /* input string */
    s=malloc(sizeof(s));    

    int c;

    if(argc==1){ // if file name not given


        while (gets(s)){
            puts(s);
        }
    }
}

我不明白的是,字符串 s 是如何存储在内存中的。我只为指针 s 分配内存,它有 4 个字节。现在用户给出的输入字符串存储在哪里?

4

4 回答 4

0

而不是这个你应该做

s=malloc(sizeof(*s)*(number_of_chars+1)); 

您设置number_of_chars为适当的值,以便分配内存来存储这些字符。+1是最后一个'\0'字符。

通过您的方法,您正在分配4 bytes,因此您通常可以存储那些许多字符。

于 2013-10-09T04:53:22.960 回答
0

您已经分配sizeof(void*)了字节的内存并用用户提供的数据填充它。你有一个地址并写入它,从编译器的角度来看是可以的(也许这真的是你想要的,谁知道)。即使你的程序在超过它时没有崩溃——它仍然是一个错误。它只是一个记忆,其他东西可以存储在这个区域,你会覆盖它——所以如果你这样做的话,预计会有很大的麻烦。

于 2013-10-09T04:55:35.017 回答
0

只有前四个字节是安全的。第五个字节将溢出分配的数据并踩踏其他会产生未定义行为的东西(可能会崩溃,也可能不会)。

此外,在完成写入字符后,您不会使用 '\0' 终止字符串,因此当您尝试在其上调用字符串例程 (strcpy) 时,您可能会引入另一个崩溃 - 除非您的字符串之后的内存无论如何都碰巧包含零,但是您自然不应该依赖这个机会!

于 2013-10-09T04:57:50.630 回答
0

这是可能的,因为编译器分配了两个字节。现在您在输入中提供 10 个字节,因此您分配的内存会溢出,并且只有在可用时才存储超出分配的内存的数据。

如果要存储的数据大于可用数据,则可能会出错,如果要存储的数据大于分配的数据,则不会出错。

puts 将打印数据,直到它得到 '\0'。

所以这是预期的行为!

于 2013-10-09T04:58:07.817 回答