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:分段错误。
答案 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