【问题标题】:Segmentation fault for malloc function of a 2D char array二维字符数组的 malloc 函数的分段错误
【发布时间】:2015-11-06 22:43:28
【问题描述】:

这是我的代码 sn-p 来创建包含 char 数组的二维数组。如果有人能找出可能是什么原因,那就太好了。我曾尝试同时使用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 *)malloc(2 * sizeof(char*)) 为两个指针分配空间,而不是为它们指向的任何东西。
  • 您也可以分配为:char** attrNames = malloc (3* sizeof *attrNames);。将sizeof 与您分配的指针一起使用有助于防止无意的sizeof (type) 不匹配。同样attrNames[m] = malloc (2 * sizeof **attrNames);(调整为包括strlen以获得正确的计数)
  • 我不知道为什么,但它们都不起作用
  • 我可以只做strcpy而不分配内存吗?
  • Schema 是一个结构,它包含几个整数成员、几个 char 数组和一个 2D char 数组,这是我要初始化的对象

标签: c arrays pointers memory-management


【解决方案1】:

试试下面的代码。尽管您的项目中的内存分配错误可能不太可能发生,但现在是培养良好的错误处理反射的好时机 - 当您继续进行更严重的项目时,它将节省您的培根。

注意 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 &lt;stdlib.h&gt; 获取exit() 的原型。

【讨论】:

    【解决方案2】:

    您需要为“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,这是因为我们需要为空字符终止符保留一个额外的字节。

    【讨论】:

      猜你喜欢
      • 2020-12-28
      • 1970-01-01
      • 2019-01-28
      • 2012-08-10
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多