【发布时间】: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