c/c++语言开发共享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代表最后一个''字符。

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

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

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

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

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

    所以这是预期的行为!!

      以上就是c/c++开发分享c中字符串的动态内存分配相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/519743.html

      (0)
      上一篇 2020年12月5日
      下一篇 2020年12月5日

      精彩推荐