我在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 *));
和: free(orderedIds);
谢谢
答案 0 :(得分:5)
执行此操作时:
seller_id
*orderedIds = (char *) malloc(variableNumberOfElements * sizeof (char*));
未初始化,因此其值为不确定。然后,您尝试取消引用该不确定值。这样做会调用undefined behavior。
您要直接分配给orderedIds
:
orderedIds
然后,您可以进一步将malloc的内存分配给分配的数组元素。
您对orderedIds = malloc(variableNumberOfElements * sizeof (char*));
有类似的问题:
free
free(*orderedIds);
与您已经释放的*orderedIds
相同,因此这是双重释放。这还会调用未定义的行为。您应该改为:
orderedIds[0]