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

标签 c arrays pointers memory-management

这是我的代码片段,用于创建保存 char 数组的 2D 数组。如果有人能找出原因,那就太好了。我尝试使用 malloc()calloc() 为二维数组分配内存,但没有任何积极迹象。

代码片段:

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 的变量(具有字符数据)复制到 char 数组中。

最佳答案

尝试下面的代码。尽管您的项目中不太可能出现内存分配错误,但现在是培养良好的错误处理反射能力的好时机 - 当您转向更严肃的项目时,它将拯救您的培根。

请注意,char* 指针需要一个等于字符串长度加上一个额外字节的缓冲区。 sizeof(char*) 是一个很小的值,在 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]);
    }

可以通过从函数返回错误代码或通过如下所示的致命退出来处理内存错误:

fprintf(stderr, "Out of memory\n");
exit(1);

您需要#include <stdlib.h> exit() 的原型(prototype)。

关于c - 二维字符数组的 malloc 函数的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33576885/

相关文章:

arrays - 从函数返回多维数组

c - 对 C typedef 结构的普遍误解,以及与指针的关系

c++ - 在 C++ 中应该以什么顺序释放内存?

c - 如何在linux内核中选择 "sys'和 "proc"文件

c - 另一个函数返回指针时未检测到空指针取消引用问题

ios - 如何使用 UILaunchImages Key

C中的数组可以存储在非顺序指针中吗?

c++ - 遇到中断语句时重新初始化指针变量

c - glibc 如何管理缓冲区?

c - C 中匿名 union 赋值的警告