繁体   English   中英

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

[英]Error copying an array of strings in C

我有这个功能的小错误:

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个元素的空间。

除了为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()'就是一个错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM