在C中动态创建字符串数组

时间:2018-11-15 16:28:35

标签: c string multidimensional-array memory-management

我在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);

谢谢

1 个答案:

答案 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]
相关问题