在C中打印char数组会导致分段错误

时间:2014-10-23 00:44:11

标签: c string segmentation-fault

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

这是我的代码:

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时,尝试打印名称时会出现分段错误。这是为什么?

4 个答案:

答案 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就会在走完结束之前终止。