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

时间:2014-02-19 14:43:31

标签: 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
你能帮帮我吗?非常感谢。

2 个答案:

答案 0 :(得分:0)

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

例如,如果u2,则原始标签有3个元素(第一个,第二个,NULL),现在需要4个元素的空间。

答案 1 :(得分:0)

除了为u+2项分配内存外,问题还在于

free(*tab);

您没有向我们展示如何在将标签传递给函数之前创建标签,但有两种可能性:

  • 如果您创建的方式与创建new[]的方式相同,那么您需要按照相同的相反步骤free()进行创建:
    int u = 0;
    while (tab[u]) {
      free(tab[u]);
      tab[u] = NULL;  // Not necessary, but makes debugging easier.
    }
    free(tab);
    tab = NULL;
  • 如果没有使用malloc()创建它,那么`free()'就是错误。