二维字符数组malloc函数的分段错误

二维字符数组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数组的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->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]);
    }