在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'}; 

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

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

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