c/c++语言开发共享在C中打印char数组会导致分段错误

我做了很多搜索,找不到同样问题的任何问题。

这是我的代码:

void fun(char* name){ printf("%s",name); } char name[6]; sscanf(input,"RECTANGLE_SEARCH(%6[A-Za-z0-9])",name) printf("%s",name); fun(name); 

该名称是从scanf抓取的,它首先打印出来。 然后,当调用fun时,在尝试打印名称时会出现分段错误。 为什么是这样?

    看完我的后备玻璃后,我知道了:

    你的scanf确实溢出了缓冲区(超过6个字节,包括终结器读取),由于环境的原因,效果略有延迟:

    没有其他人依赖或重新使用最初损坏的内存,因此第一个printf似乎工作。

    在第一次调用printf之后和第二次调用printf之前的某个地方,重写的空间被重新使用,因此在遇到未分配的页面之前,您读取的字符串不再被终止。
    因此,最终出现了分段错误。

    当然,你的程序在溢出缓冲区的那一刻就干杯,而不是在它最终崩溃的时候。
    士气:永远不要写入你没有献身的记忆。

    查看您的编辑,格式%6[A-Za-z0-9]尝试读取最多6个字符,不包括终结符,不包括在内!

    由于您正在读取6个字符,因此您必须将name声明为7个字符,因此可以使用终止空字符:

     char name[7]; 

    否则,您将获得缓冲区溢出,并且后果未定义。 一旦你有不明确的后果,任何事情都可能发生,包括2次成功调用printf()然后在调用另一个函数时出现段错误。

    您可能正在使用printf语句离开数组的末尾。 Printf使用终止空字符’ 0’来知道字符串结尾的位置。 尝试像这样分配你的数组:

     char name[6] = {''}; 

    这将为您的数组分配最初设置为’ 0’字符的每个元素,这意味着只要您不使用scanf覆盖整个数组,printf将在离开结束之前终止。

    你确定该name是零字节终止? scanf可能会溢出缓冲区,具体取决于您的调用方式。

    如果发生这种情况,则printf将读取超出数组末尾的行为,从而导致未定义的行为并可能出现分段错误。

      以上就是c/c++开发分享在C中打印char数组会导致分段错误相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

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

      ctvol管理联系方式QQ:251552304

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

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

      精彩推荐