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);
谢谢
当你这样做:
*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)
*orderedIds和orderedIds[0]你已经免费的一样,所以这是免费的.这也会调用未定义的行为.你应该改为:
free(orderedIds);
Run Code Online (Sandbox Code Playgroud)