【问题标题】:Creating an array of strings dynamically in C在 C 中动态创建字符串数组
【发布时间】:2019-04-18 19:36:00
【问题描述】:

我在 Ubuntu 18.04 上有下一个 C 代码:

#define ID_LEN 5

int main(int argc, char *argv[])
{
    int variableNumberOfElements = 5;
    char **orderedIds;

    *orderedIds = (char *) malloc(variableNumberOfElements * sizeof (char*));
    for (int i = 0; i < variableNumberOfElements; i++)
        orderedIds[i] = (char *) malloc((ID_LEN+1) * sizeof(char));


    for (int i = 0; i < variableNumberOfElements; i++)
        free (orderedIds[i]);

    free(*orderedIds);
    return 0;
}

我以这种方式构建这段代码:

g++ -g mymain.c

当我运行这个程序时,我在行中收到“分段错误(核心转储)”错误

*orderedIds = (char *) malloc(variableNumberOfElements * sizeof (char*));

问题出在哪里?

更新:

分配内存的正确方法是: orderedIds = (char **) malloc(variableNumberOfElements * sizeof (char*));

和: 免费(orderedIds);

谢谢

【问题讨论】:

  • orderedIds 未初始化。
  • orderedIds 是一个指针,但在取消引用它之前你永远不会让它指向任何地方,导致undefined behavior不要在那里取消引用它(在调用free时)。
  • 看起来更像是错误将malloc的结果转换为char *
  • 谢谢大家。 @Someprogrammerdude 编译器需要 -fpermissive 标志以避免在 malloc 中强制转换

标签: c string multidimensional-array memory-management


【解决方案1】:

当时你这样做:

*orderedIds = (char *) malloc(variableNumberOfElements * sizeof (char*));

orderedIds 未初始化,因此其值为indeterminite。然后,您尝试取消引用这个不确定的值。这样做会调用undefined behavior

你想直接分配给orderedIds

orderedIds = malloc(variableNumberOfElements * sizeof (char*));

然后您可以进一步将 malloc 的内存分配给您分配的数组元素。

free 也有类似的问题:

free(*orderedIds);

*orderedIds 与您已经释放的orderedIds[0] 相同,所以这是双重释放。这也会调用未定义的行为。你应该有:

free(orderedIds);

【讨论】:

  • 谢谢!因为我没有启用 -fpermissive,所以我需要进行强制转换。出于这个原因,我发现了这个错误。现在我做了正确的投射
  • @J19 不需要演员表。如果是,那么您将编译为 C++,而不是 C。-fpermissive 是 C++ 选项。请改用gcc
  • @dbush 是的,正如他在问题中提到的那样,OP 正在使用 g++ 进行编译。他为什么要用 gcc 编译? C 的类型检查非常宽松;例如,您可以简单地将 void 指针分配给不同类型的变量,而无需再考虑一下,这对我来说似乎是错误的。
猜你喜欢
  • 2017-03-29
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
相关资源
最近更新 更多