从那里借用代码,我有一些看起来像这样的东西(感谢 luser droog 的漂亮示例代码):
enum { BUFSZ = 50 };
enum { STRVSZ = 40 };
enum { STRVVSZ = 20 };
char buf[BUFSZ + 1];
char *strv[STRVSZ + 1];
char **strvv[STRVVSZ + 1];
int j;
int i;
while(1){
fgets(buf, BUFSZ, infile);
i = 0;
strv[i] = strdup(buf);
strv[i+1] = NULL;
j = 0;
strvv[j] = calloc(i+1, sizeof *strvv[j]); // assuming i is the count of elements
memcpy(strvv[j], strv, i * sizeof *strvv[j]);
j++;
}
这可能不会马上跑出去,但它说明了与我正在运行的类似的东西。基本上,strv 的内容需要在每次循环迭代后存储在 strvv 中,并且 strv 根据用户输入随时间变化。
使用 calloc 和 memcpy 应该会导致 strvv 在循环的每次迭代中维护 strv 的副本,而与 strv 中的值无关。但是,当我打印出 strvv 的内容时,它会为每个条目打印出相同的字符串,这意味着当前的方法仍在移动指针,而不是在每个 strvv 条目中复制 strv。
我完全不确定为什么会发生这种情况或如何解决它。memcpy 应该制作 strv 中的指针指向 =/ 的字节级副本。