在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
将读取超出数组末尾的行为,从而导致未定义的行为并可能出现分段错误。