c中字符串的动态内存分配

我发现这段代码完美无缺。

#include  #include  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分配内存,指针是4个字节。现在用户给出的输入字符串存储在哪里?

它只对前四个字节安全。 第五个字节将溢出分配的数据并在其他内容上进行操作,这将产生未定义的行为(可能会崩溃,可能不会)。

另外,在写完字符后,不要使用’\ 0’来终止字符串,所以当你尝试在字符串上调用字符串例程(strcpy)时,你可能会引入另一个崩溃 – 除非字符串后面的内存恰好包含零,但自然你不应该依赖这个机会!

你不应该这样做

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

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

使用您的方法,您将分配4 bytes因此您通常可以存储那么多字符。

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

编译器可以分配两个字节。 现在你输入10个字节,所以你分配的内存溢出,数据存储超出你分配的内存,只有它可用。

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

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

所以这是预期的行为!!