malloc动态内存分配过程中的分段错误

Abh*_*bhi 2 c gcc segmentation-fault

这可能是一个非常愚蠢的问题.
我正在使用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);
}
Run Code Online (Sandbox Code Playgroud)

我编译: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);
Run Code Online (Sandbox Code Playgroud)

注意:gcc版本4.5.2

AnT*_*AnT 7

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

p = malloc(n * sizeof *p);
Run Code Online (Sandbox Code Playgroud)

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

在您的情况下,第一次分配应该看起来像

mat = malloc(row * sizeof *mat);
Run Code Online (Sandbox Code Playgroud)

循环内的分配应该如下

for (i = 0; i < row; ++i)
   mat[i] = malloc(col * sizeof *mat[i]);
Run Code Online (Sandbox Code Playgroud)

这种方法的重要好处是代码是独立于类型的:在任何时候你都可以改变matfrom 的声明int **mat,比如说double **mat,但是分配代码将继续保持有效 - 你不必在那里做任何改变.