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

J19*_*J19 -1 c string memory-management multidimensional-array

我在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;
}
Run Code Online (Sandbox Code Playgroud)

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

g++ -g mymain.c
Run Code Online (Sandbox Code Playgroud)

当我运行这个程序时,我收到一个"分段故障(核心转储)"错误

*orderedIds = (char *) malloc(variableNumberOfElements * sizeof (char*));
Run Code Online (Sandbox Code Playgroud)

哪个是问题?

更新:

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

和:free(orderedIds);

谢谢

dbu*_*ush 5

当你这样做:

*orderedIds = (char *) malloc(variableNumberOfElements * sizeof (char*));
Run Code Online (Sandbox Code Playgroud)

orderedIds没有初始化,所以它的价值是不确定的.然后,您会考虑取消引用这个不确定的值.这样做会调用未定义的行为.

您想orderedIds直接分配:

orderedIds = malloc(variableNumberOfElements * sizeof (char*));
Run Code Online (Sandbox Code Playgroud)

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

你有类似的问题free:

free(*orderedIds);
Run Code Online (Sandbox Code Playgroud)

*orderedIdsorderedIds[0]你已经免费的一样,所以这是免费的.这也会调用未定义的行为.你应该改为:

free(orderedIds);
Run Code Online (Sandbox Code Playgroud)