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

malloc动态内存分配过程中的分段错误,c,gcc,segmentation-fault,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 co

问这个问题可能很愚蠢。
我正在使用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版本4.5.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));

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

常见的
malloc
习惯用法如下:要分配指针指向的
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 = malloc(row * sizeof *mat);
for (i = 0; i < row; ++i)
   mat[i] = malloc(col * sizeof *mat[i]);
for(i=0;i

这种方法的重要好处是代码与类型无关:您可以随时将
mat
的声明从
int**mat
更改为,比如说,
double**mat
,但是分配代码将继续保持有效-您不必在那里做任何更改。

编译器会用-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]
以下是:

mat
是双指针,未初始化(或空)。 取消引用时:

*mat = (int *)malloc(sizeof(int)*row);
您正在取消对空值的引用并尝试为其赋值,从而导致分段错误

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

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

对于(i=0;i*mat=(int*)malloc(sizeof(int)*行);mat尚未指向任何内容。@CharlieBurns:这就是我将内存分配给指针的内容,然后我将在该内存位置存储值。如果我缺少某些内容,请告诉我。如果我将从malloc返回的空指针直接分配给数组指针,则我将得到以下错误:“错误:从'void*'到'float*'[-fppermissive]的转换无效”。如何解决此问题?