这可能是一个非常愚蠢的问题 我正在使用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
答案 0 :(得分:6)
常见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
,但是分配代码将继续有效 - 您无需在那里进行任何更改。
答案 1 :(得分:3)
而不是
*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));
答案 2 :(得分:2)
编译器会用-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]
答案 3 :(得分:1)
在*mat = (int *) malloc(sizeof(int)*row);
行中,你试图取消引用。垫目前尚未初始化。
答案 4 :(得分:0)
以下是:
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))