二维字符数组malloc函数的分段错误
下面是我创建包含char数组的2D数组的代码片段。如果有人能找出原因,那就太好了。我尝试使用malloc和calloc为2D数组分配内存,但没有任何积极的迹象 代码段:二维字符数组malloc函数的分段错误,c,arrays,pointers,memory-management,C,Arrays,Pointers,Memory Management,下面是我创建包含char数组的2D数组的代码片段。如果有人能找出原因,那就太好了。我尝试使用malloc和calloc为2D数组分配内存,但没有任何积极的迹象 代码段: char** attrNames = (char **)malloc(3*sizeof(char*)) for (m = 0; m < 3; m++) { attrNames[m] = (char *)malloc(2 * sizeof(char*)); strcpy(schema->
char** attrNames = (char **)malloc(3*sizeof(char*))
for (m = 0; m < 3; m++) {
attrNames[m] = (char *)malloc(2 * sizeof(char*));
strcpy(schema->attrNames[m], temp_buff2[m]);
}
我正在尝试分配内存,然后进行循环,再次分配内存,并将数据从名为temp_buff2 has character data的变量复制到char数组中。请尝试下面的代码。尽管项目中不太可能出现内存分配错误,但现在是开发良好的错误处理反射的好时机——当您继续进行更严肃的项目时,它将为您节省开支 请注意,char*指针需要一个缓冲区,该缓冲区等于字符串长度加上一个额外字节。sizeofchar*是一个很小的值,在64位体系结构中仅为8-它只存储字符串开始的内存地址的值。请注意,我们需要在strlen的顶部加上+1,因为strcpy将额外存储一个字节\0作为字符串终止符
char** attrNames = (char **)malloc(3*sizeof(char*));
if (!attrName)
{
// handle memory error
}
for (m = 0; m < 3; m++) {
attrNames[m] = (char *)malloc(strlen(temp_buff2[m])+1);
if (!attrNames[m])
{
// handle memory error
}
strcpy(schema->attrNames[m], temp_buff2[m]);
}
您需要为exit原型预留足够的空间。您需要为temp_buff2内的任何东西预留足够的空间。例如:
char** attrNames = (char **)malloc(3*sizeof(char*))
for (m = 0; m < 3; m++) {
attrNames[m] = (char *)malloc( strlen(temp_buff2[m]) + 1 );
strcpy(schema->attrNames[m], temp_buff2[m]);
}
请注意,我在strlen结果中添加了1,这是因为我们需要为null char终止符保留额外的字节。正是如此。char*malloc2*sizeofchar*为两个指针分配空间,而不是为它们指向的任何对象分配空间。您也可以按以下方式分配:char**attrNames=malloc 3*sizeof*attrNames。将sizeof与正在分配的指针一起使用有助于防止无意中出现sizeof类型不匹配。类似地,attrNames[m]=malloc 2*sizeof**attrNames;调整为包含strlen以获得正确的计数,如上所述我不知道为什么,但它们都不工作。我可以在不分配内存的情况下执行strcpy吗?Schema是一个结构,它包含几个整数成员、几个字符数组和一个2D字符数组,这正是我试图初始化的
char** attrNames = (char **)malloc(3*sizeof(char*));
if (!attrName)
{
// handle memory error
}
for (m = 0; m < 3; m++) {
attrNames[m] = (char *)malloc(strlen(temp_buff2[m])+1);
if (!attrNames[m])
{
// handle memory error
}
strcpy(schema->attrNames[m], temp_buff2[m]);
}