我正在编写"二进制搜索"的代码。与此同时,我写了一些代码,看看我的起点,中点和终点在哪里。为此,我打印出一个字符串,其中开头,中间和末尾的数字被方括号括起来。因为这导致了我的分段错误,我制作了代码的副本并将其压缩到导致问题的最小代码量。
这是代码:
#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;尽管不应该改变,但要改变。至少它不会被我改变。
那么为什么会这样呢?
答案 0 :(得分:1)
您将buf
声明为20 char
的数组,但您写的是“[1] [3] [6] [9] [10] [14] [16] [17] [ 21]“to it,41 char
,包括终止null。在循环期间,strcat
超出buf
并将数据写入内存,它不应该,这会破坏您流程中的其他内容。