【发布时间】:2021-12-28 13:54:04
【问题描述】:
我有一个数组,它保存 string 的 chars,并希望找到它的 suffixes。如果我在数组中添加 7 个字符,则字符总数应该是 7*8/2 = 28。所以 suffix_array 限制应该是 28。当我尝试创建后缀数组时,我注意到数组也有空字符。所以我的输出是错误的。 这是什么原因?
#include <stdio.h>
#include <stdlib.h>
static char *suffix;
int main()
{
char s[7] = {'c','o','n','n','e','c','t'};
suffix = (char*) malloc(sizeof (char)*28);
int j;
static int k=0;
j=k;
for(int i=0; i<28; i++) {
suffix[i] = s[j];
printf("%c ", suffix[i]);
if(j<7) {
j++;
}
else {
k++;
j=k;
}
}
return 0;
}
Output:
c o n n e c t o n n e c t n n e c t n e c t e c
【问题讨论】:
-
你在哪里输出任何东西?
-
循环的每 7 次迭代,您就有
j == 7,而s[7]越界(零索引数组,记得吗?) -
请注意,AddressSanitizer 和 UBSan 都会立即捕获此溢出:godbolt.org/z/fzPMfqx4a
-
@Ahmeett_ Re "我不知道在这种情况下如何调试我的程序",学习时,有时最好拿出一张纸,然后创建一个每个变量的列。自己走一遍程序。但是,您可以使用 IDE 来做同样的事情。您试图回答的问题是:实际行为在哪里偏离了预期行为?你可以倒过来工作。当我收到错误时,我的变量有什么值? (
suffix[i]是垃圾)。为什么?s[j]是垃圾。为什么?j==7,超出了数组的末尾。为什么?if (j<7) { j++; }错了。 -
请注意,
-fsanitize=address会缩短该过程,将您直接带到“j 超出数组末尾”。
标签: arrays c for-loop undefined-behavior