c - 使用 malloc 进行动态内存分配期间出现段错误

标签 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);
}

我编译: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

最佳答案

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

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 ,但分配代码将继续保持有效 - 您无需在那里进行任何更改。

关于c - 使用 malloc 进行动态内存分配期间出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18879309/

相关文章:

c++ - sprintf 的错误用法?

c++ - 为什么编译器不对此进行优化?

c - 程序中的未知错误

C:从文件读取时出现段错误

c++ - 执行 CUDA 程序时出现段错误

c - strcpy(m+1,m) 的不可预测行为

c - OpenMPI C语言scanf不停止接受输入(Mac OS X 10.10)

c - gcc 中的 -ffreestanding 选项是什么?

c++ - 从 C API 调用的 Lua 脚本的执行时间限制

编译器声称指针在未使用时为 const