【问题标题】:segmentation fault in during dynamic memory allocation with malloc使用 malloc 进行动态内存分配期间的分段错误
【发布时间】:2013-09-23 15:08:04
【问题描述】:

这可能是一个非常愚蠢的问题。
我正在使用 malloc 进行内存分配。
程序编译正常,但启动时出现分段错误。
这是最小代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    int row,col,i;
    int **mat;
    row = 3; //made row as static for testing
    col = 4; //made col as static for testing
    *mat = (int *)malloc(sizeof(int)*row);
    for (i=0;i<row;i++)
       mat[i] = (int *) malloc (sizeof(int)*col);
}

我编译时使用:gcc -ggdb test.c
在 gdb 上它的捐赠:

(gdb) run
Starting program: /slowfs/swe91/abjoshi/clients/fw_cl_for_seg_fault/a.out

Program received signal SIGSEGV, Segmentation fault.
0x00000000004004cc in main () at 1test.c:10
10          *mat = (int *)malloc(sizeof(int)*row);

注意:gcc 版本 4.5.2

【问题讨论】:

  • *mat = (int *)malloc(sizeof(int)*row); mat 还没有指向任何东西。
  • @CharlieBurns:这就是我将内存分配给指针的内容,然后我会将值存储在该内存位置。如果我遗漏了什么,请告诉我。

标签: c gcc segmentation-fault


【解决方案1】:

常见的malloc 习惯用法如下:分配由指针p 指向的n 元素数组使用以下通用语法

p = malloc(n * sizeof *p);

这将帮助您避免代码中的错误。注意这里的重点:不要强制转换malloc 的结果,也不要使用sizeof 下的类型。一般来说:尽可能避免在声明之外的任何地方提及类型。

在你的情况下,第一个分配应该是

mat = malloc(row * sizeof *mat);

循环内的分配应如下所示

for (i = 0; i < row; ++i)
   mat[i] = malloc(col * sizeof *mat[i]);

这种方法的重要好处是代码与类型无关:您可以随时将mat 的声明从int **mat 更改为double **mat,但分配代码将继续保留有效 - 您无需在此处进行任何更改。

【讨论】:

  • 如果我将从 malloc 返回的 void 指针直接分配给数组指针,则会收到以下错误:“错误:从 'void*' 到 'float*' 的无效转换 [-fpermissive ]”。我该如何解决?
【解决方案2】:

代替

*mat = (int *)malloc(sizeof(int)*row);

我想你想要

mat = (int **)malloc(sizeof(int *) * row);

事实上,您正在取消对未初始化的 mat 的引用。你需要 malloc() mat 在你尊重它之前。

你也可以不使用 malloc 的演员表:

mat = malloc(sizeof(int *) * row);

以及sizeof(int *)参考:

mat = malloc( row * sizeof(*mat));

【讨论】:

    【解决方案3】:

    编译器会用 -Wall 告诉它

    $ gcc -Wall y.c
    y.c: In function ‘main’:
    y.c:14:1: warning: control reaches end of non-void function [-Wreturn-type]
    y.c:11:8: warning: ‘mat’ is used uninitialized in this function [-Wuninitialized]
    

    【讨论】:

      【解决方案4】:

      *mat = (int *) malloc(sizeof(int)*row); 行中,您正在尝试取消引用 mat。 mat 当前未初始化。

      【讨论】:

        【解决方案5】:

        这是什么:

        mat 是一个双指针,它未初始化(或 NULL)。 当你取消引用它时:

        *mat = (int *)malloc(sizeof(int)*row);
        

        您正在取消引用 NULL 值并尝试分配给它,导致分段错误。

        首先使用指向 (int*) 指针列表的指针初始化 mat。 然后分别取出列表中的每个指针并为每个指针分配 (int) 空间。

        mat = (int *)malloc(cols*sizeof(int *));
        for (i=0;i<cols;i++)
            mat[i] = malloc(rows*sizeof(int))
        

        【讨论】:

          猜你喜欢
          • 2020-11-12
          • 1970-01-01
          • 2022-11-10
          • 1970-01-01
          • 1970-01-01
          • 2013-11-20
          • 2020-01-14
          • 1970-01-01
          • 2020-11-23
          相关资源
          最近更新 更多