malloc导致SIGSEGV:分段错误

时间:2010-12-17 07:36:52

标签: c malloc

typedef struct Matrix
{
    double * matrix;
    int sizex;
    int sizey;
}Matrix;

int nn = 257;
Matrix * g = (Matrix *)malloc(sizeof(Matrix *));
g->matrix = malloc(sizeof(double) * nn * nn);
g->sizex = nn;
g->sizey = nn;

此代码在到达g->matrix = malloc(sizeof(double) * nn * nn);时出错 有谁看到它的问题?

编辑:发现在显示分配之前访问未分配内存的问题,导致SIGSEGV:分段错误。

7 个答案:

答案 0 :(得分:6)

您需要将malloc not sizeof 指针的大小Matrix传递给Matrix

更改

Matrix * g = (Matrix *)malloc(sizeof(Matrix *));
                                           ^^ 

Matrix * g = (Matrix *)malloc(sizeof(Matrix));

此外,您必须始终检查malloc的返回值,并确保在您使用已分配的内存之前分配成功。

答案 1 :(得分:0)

我猜你正在使用一些古老的16位编译器,可能是Turbo C.垃圾它并获得gcc,如果你想构建DOS程序,可以使用djgpp;如果你想构建Windows程序,可以使用mingw或cygwin。 / p>

假设我是对的,257 * 257溢出了最大可寻址大小65536,更不用说将它乘以8时会发生什么。

编辑: OP在我写完之后改变了问题所以它可能完全关闭了。如果是这样我会删除它。

答案 2 :(得分:0)

Matrix * g = (Matrix *)malloc(sizeof(Matrix *)); 

这为指向Matrix的指针保留了足够的堆空间,但是您需要足够的堆空间用于Matrix本身。尝试:

Matrix* g = (Matrix*)malloc(sizeof(Matrix)); 

完整的工作计划:

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

typedef struct Matrix {
    double * matrix;
    int sizex;
    int sizey;
} Matrix;

int main()
{
    int nn = 257;
    Matrix * g = (Matrix *)malloc(sizeof(Matrix));
    if (g == NULL)
    {
        printf("g = malloc() failed\n");
        return 1;
    }
    g->matrix = malloc(sizeof(double) * nn * nn);
    g->sizex = nn;
    g->sizey = nn; 
    printf("g %p, g->matrix %p, g->sizex %d, g->sizey %d\n",
            g, g->matrix, g->sizex, g->sizey);
    return 0;
}

我的Linux机箱输出:

g 0x8822008, g->matrix 0xf6ea6008, g->sizex 257, g->sizey 257

答案 3 :(得分:0)

Matrix * g = (Matrix *)malloc(sizeof(Matrix *));

应该是

Matrix * g = (Matrix *)malloc(sizeof(Matrix));

您只是将指针的大小分配给Matrix,而不是Matrix本身。

答案 4 :(得分:0)

您没有为Matrix对象分配内存,而是为指针分配。

更改您的第一个malloc来电:

Matrix * g = malloc(sizeof(*g));

我更喜欢这种风格,因为你不需要在C语言中从void *显式指针,你可以在变量的基础类型上做sizeof。如果您更改g的类型(或将来的代码),这可以为您节省麻烦。

同样适用于风格:

g->matrix = malloc(sizeof(double) * nn * nn);

应该是:

g->matrix = malloc(sizeof(*(g->matrix)) * nn * nn);

答案 5 :(得分:0)

sizeof的参数不应该是指针。

答案 6 :(得分:0)

我只是添加不投射malloc返回的方向。它是不必要的,污染物,并可能导致不必要的行为(如下所述:http://c-faq.com/malloc/mallocnocast.html