c - 在 C 中复制字符串数组时出错

标签 c debugging char string

这个函数有一个小错误:

char **addtotab(char **tab, char *newline) {
  int u;
  char **new;

  u = 0;
  while (tab[u])
    u++;

  if ((new = (char **)malloc(sizeof(char *) * (u + 2))) == NULL)
    return (NULL);

  u = 0;
  while (tab[u]) {
    new[u] = strdup(tab[u]);
    u++;
  }
  new[u] = strdup(newline);
  new[u + 1] = NULL;

  u = 0;
  while (tab[u]) {
    free(tab[u]);
    u++;
  }
  free(tab);
  return (new);
}

它是从 main() 调用的,如下所示:

tab = addtotab(tab, line)

我的问题是 tab 在程序末尾有错误的数据。 tab[0] 始终为空。

例如,我使用以下数据初始化 tab:

Alii summum decus in carruchis solito altioribus
Et quia Montius inter dilancinantium manus
Restabat ut Caesar post haec properaret accitus et
Siquis enim militarium vel honoratorum aut nobilis
Et olim licet otiosae sint tribus pacataeque
Ut enim quisque sibi plurimum confidit et ut
Sed laeditur hic coetuum magnificus splendor
Etenim si attendere diligenter, existimare vere de
Denique Antiochensis ordinis vertices sub uno
Post quorum necem nihilo lenius ferociens Gallus

但我得到了这个结果

Empty
Et quia Montius inter dilancinantium manus
Restabat ut Caesar post haec properaret accitus et
Siquis enim militarium vel honoratorum aut nobilis
Et olim licet otiosae sint tribus pacataeque
Ut enim quisque sibi plurimum confidit et ut
Sed laeditur hic coetuum magnificus splendor
Etenim si attendere diligenter, existimare vere de
Denique Antiochensis ordinis vertices sub uno
Post quorum necem nihilo lenius ferociens Gallus

你能帮我吗?非常感谢。

最佳答案

您必须为 u + 2 元素分配空间,而不是为 u + 1 元素分配空间。

例如,如果 u2,则您的原始选项卡有 3 个元素(第一个、第二个、NULL),现在您需要空间容纳 4 个元素。

关于c - 在 C 中复制字符串数组时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21883793/

相关文章:

c - 如何在函数中传递指针?

捕获输入作为输入(对于 int 和 char 变量)

c - 举例说明在 C 中扫描一个字符

java - 无法在 Eclipse 中连接到 VM

c - 获取文本而不是 EOF

c++ - 根据缓冲区长度将空终止字符数组复制到 std::string

c - R 中负二项式密度 (dnbinom) 的参数化

c - 如何将 send() 与整数一起使用

java - IntelliJ 抛出 Java.Net.SocketException : unable to open debugger, "socket closed"

android - 在 Eclipse 中调试 Android NDK C/C++ 代码 - 断点未命中