我做了很多搜索,找不到同样问题的任何问题。
这是我的代码:
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
时,尝试打印名称时会出现分段错误。这是为什么?
答案 0 :(得分:2)
看着我的后备玻璃后,我知道了:
你的scanf
确实溢出了缓冲区(超过6个字节,包括终结符读取),由于环境原因,导致了不良影响:
没有其他人依赖或重新使用最初损坏的内存,因此第一个printf
似乎有效。
在第一次和第二次调用printf
之后的某个地方,你覆盖的空间被重新使用,所以你读到的字符串在遇到未分配的页面之前不再被终止。
因此,终于出现了分段错误。
当然,你的程序在溢出缓冲区的那一刻就干杯了,而不是在它最终崩溃的时候 士气:永远不要写入你没有献身的记忆。
查看您的编辑,格式%6[A-Za-z0-9]
尝试读取最多6个字符,不包括终结符!
答案 1 :(得分:2)
由于您正在阅读6个字符,因此您必须将name
声明为7个字符,因此终止空字符有空间:
char name[7];
否则,您将获得缓冲区溢出,并且后果未定义。一旦你有不确定的后果,任何事情都可能发生,包括2次成功调用printf()
,然后在你调用另一个函数时出现段错误。
答案 2 :(得分:0)
你确定name
是零字节终止吗? scanf
可能会溢出缓冲区,具体取决于您的调用方式。
如果发生这种情况,那么printf
将读取超出数组末尾的行为,从而导致未定义的行为并可能出现分段错误。
答案 3 :(得分:0)
您可能会使用printf语句离开数组的末尾。 Printf使用终止空字符' \ 0'知道字符串结尾的位置。尝试像这样分配你的数组:
char name[6] = {'\0'};
这将为您的数组分配最初设置为' \ 0'的每个元素。字符,这意味着只要你不用scanf覆盖整个数组,printf就会在走完结束之前终止。