我发现这段代码工作正常。
#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分配内存,指针是4个字节。现在用户给出的输入字符串存储在哪里?
答案 0 :(得分:0)
而不是这样你应该做
s=malloc(sizeof(*s)*(number_of_chars+1));
将number_of_chars
设置为适当的值,以便分配内存来存储这么多字符。 +1
代表最后'\0'
个字符。
通过您的方法,您可以分配4 bytes
,这样您就可以存储那么多字符。
答案 1 :(得分:0)
您已经分配了sizeof(void*)
个字节的内存,并用用户提供的数据填充它。你有一个地址并写信给它,从编译器的角度来看是可以的(也许它真的是你想要的,谁知道)。即使你的程序在超过它时没有崩溃 - 它仍然是一个错误。它只是一个记忆,其他东西可以存储在这个区域,你会覆盖它 - 所以如果你曾经这样做,那就预计会遇到麻烦。
答案 2 :(得分:0)
前四个字节只能安全。第五个字节将溢出分配的数据并在其他内容上进行操作,这将产生未定义的行为(可能会崩溃,可能不会)。
此外,在完成字符编写后,你不会使用'\ 0'终止字符串,因此当你尝试调用字符串例程(strcpy)时,你可能会引入另一个崩溃 - 除非内存在你的字符串碰巧包含零之后,你自然不应该依赖这个机会!
答案 3 :(得分:0)
编译器可以分配两个字节。 现在你输入10个字节,所以你分配的内存溢出,数据只有在可用时才会存储在你分配的内存之外。
如果您要存储的数据大于可用数据,则可能会出错,如果您要存储的数据大于分配数据,则不会出错。
puts将打印数据,直到获得'\ 0'。
所以这是预期的行为!!