Clang循环优化会导致分段错误吗?

时间:2018-01-31 15:56:49

标签: c clang

我正在编写"二进制搜索"的代码。与此同时,我写了一些代码,看看我的起点,中点和终点在哪里。为此,我打印出一个字符串,其中开头,中间和末尾的数字被方括号括起来。因为这导致了我的分段错误,我制作了代码的副本并将其压缩到导致问题的最小代码量。

这是代码:

#include <stdio.h>
#include <string.h>

int main(void)
{
    int values[9] = {1, 3, 6, 9, 10, 14, 16, 17, 21};
    int n = sizeof(values) / sizeof(int); // <-- make this is a "const", and the "segmentation fault" goes away

    char buf[20] = "";
    char num[6] = "";

    for(int i = 0; i < n; i++)
    {
        printf("i: %i, n: %i\n", i, n);

        sprintf(num, "[%i] ", values[i]);

        strcat(buf, num);
    }

    return 0;
}

用这一行编译:

clang -std=c99 -Wall -Werror loop.c -o loop

不知何故&#34; n&#34;尽管不应该改变,但要改变。至少它不会被我改变。

那么为什么会这样呢?

1 个答案:

答案 0 :(得分:1)

您将buf声明为20 char的数组,但您写的是“[1] [3] [6] [9] [10] [14] [16] [17] [ 21]“to it,41 char,包括终止null。在循环期间,strcat超出buf并将数据写入内存,它不应该,这会破坏您流程中的其他内容。