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

时间:2013-10-09 04:49:19

标签: c string memory

我发现这段代码工作正常。

#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个字节。现在用户给出的输入字符串存储在哪里?

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'。

所以这是预期的行为!!