【发布时间】:2019-07-12 20:29:22
【问题描述】:
这是我的代码
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
/**************************************************
a is a pointer to an array of strings
b is a string
This function appends b to *a
n is the number of strings currently "held" by *a
**************************************************/
int append(char ***a, char *b, unsigned long n) {
if (a && *a && **a) {
char** tmp = realloc(*a, (n + 1) * sizeof(**a));
if (tmp) {
tmp[n] = b;
*a = tmp;
return 0;
}
}
return -1;
}
void test() {
char *words[7] = { "food", "is", "good", "to", "eat,", "like", "pizza" };
char** a = malloc(1 * sizeof(*a));
for (int i = 0; i < 7; i++) {
append(&a, words[i], i);
int j = 0;
while (j <= i)
printf("%s ", a[j++]);
printf("\n");
}
}
int main() {
test();
return 0;
}
代码总是可以正常编译并且没有警告。并且可执行文件在大约 95% 的时间内按预期运行。但是大约 5% 的时间,我会遇到分段错误。我知道故障发生在a[j++],但我不明白为什么。
【问题讨论】:
-
如果一切正常"sometimes",那么您肯定会调用Undefined Behavior....
-
@DavidC.Rankin 和分段错误使这个赌注成为一个明确的胜利:)
-
好的,谢谢大家。那么我在哪里调用未定义的行为?
-
请注意,成为3-Star Programmer 并不是恭维。您最好创建一个结构来保存指针数组,以及分配的大小和正在使用的大小。然后,您可以避免将数组的大小加一;这可能导致性能非常差(二次行为),因为在重新分配内存时会复制数据。但是,这并不是导致崩溃的直接原因。
标签: c pointers segmentation-fault