Malloc调用崩溃,但在其他地方工作

我想知道是否有人可能对此有任何见解……

我的程序崩溃了这个电话:

void subtract(data* array,data* inverse,int a, int b, int q, int n) { data* arraytomultiply; arraytomultiply = (data *)malloc(sizeof(data*) * n); 

数据只保存一个int(为了方便以后切换类型)

 typedef struct { int value; }data; 

我已经尝试了很多改变指针的方法,因为我对它们完全没有信心,但无济于事。

奇怪的是,在程序的早期阶段,同样的调用工作,我为它分配值,并可以打印出来的一切……:

 data* array; array = (data*)malloc(sizeof(data*) * m * n); // m * n entries 

可能有用的一件事(虽然我不知道为什么)是当它早期工作时它在一个void函数中,而当它崩溃时它在一个从算法中调用的函数中。 但是我根本没有看到它会如何影响它,因为我正在尝试做的是不使用任何参数等…

有任何想法吗?

不应该是sizeof(数据)而不是sizeof(data *),因为你正在为数据结构分配空间吗?

您正在分配m * ndata *元素data *而不是data 。 如果你想要data指针数组,那么你在malloc()中所做的是正确的但是应该分配给data **

 array = (data*)malloc(sizeof(data*) * m * n); // m * n entries 

它应该是

 array = (data*)malloc(sizeof(data) * m * n); // m * n entries 

并且,您应该始终检查malloc()的返回值以查找它是失败还是成功!

 if ((array = (data*)malloc(sizeof(data) * m * n)) == NULL) { printf("unable to allocate memory"); return; // you can return your error code here! } 

你的程序有充分的理由崩溃。 但是当你说, it worked earlier but crashed later了做了一些实验。 我尝试了你的代码片段,发现它适合我。 我尝试了很多次,但从未坠毁过。 我感到困惑,我发布了一个问题,找出原因?! – 这里可用“malloc(sizeof(struct a *))”和“malloc(sizeof(struct a))”是一样的吗?

+1你的问题!

你们都是对的,但无论如何我想知道为什么会崩溃。

我想知道因为data的大小(如上所定义)预计会小于或等于data*的大小data*

当malloc崩溃时,通常是因为你搞砸了它用来跟踪其他地方堆上内存的结构。 你的程序是multithreading的吗? 尝试使用helgrind或drd(两个valgrind工具)运行它。 这些可以帮助您跟踪竞争条件,无保护的数据访问或其他线程问题。