调用 malloc 导致崩溃,但在其他地方正常工作

3

我想知道是否有人能够对此提供任何见解...

我的程序在这个调用上崩溃:

void subtract(data* array,data* inverse,int a, int b, int q, int n)
{

data* arraytomultiply;
arraytomultiply = (data *)malloc(sizeof(data*) * n);

这里的data只是保存一个整数(为了方便以后切换类型)

typedef struct { 
        int value;
}data;

我尝试过多次更改这里的指针,但由于我对它们不是很自信,所以没有成功。

奇怪的是,在程序早期这个调用是有效的,我为它分配值并可以打印出来。

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

有一件事可能会有用(虽然我不知道为什么),那就是当它在一个空函数中运行时,它能正常工作,而当它崩溃时,它在算法内部调用的函数中。但是,考虑到我正在尝试做的不涉及任何参数等,我不认为这会对它产生影响...

有任何想法吗?


1
malloc崩溃时,几乎总是由于先前内存已被破坏的结果。我敢打赌,在先前malloc的数据块之前或之后立即写入了数据。 - Drew Dormann
啊,也许就是这样,我会回去检查之前的malloc,谢谢 :) - quetzal
你可能想要在调用减法函数时检查n的值,并将其与合理的限制进行比较。除了内存损坏之外,我曾经看到由于某些未初始化的变量而导致分配的字节数非常大,从而导致此操作失败。由于n是从函数调用中传递的,因此检查其值是良好的编程实践。 - Lou
dbeer,我该怎么找到它?我通常使用GDB进行调试,但最近不得不转换到带有VS 2010的Windows上 - 这是我第一个使用它的程序!Lou:谢谢,但n在开始时由用户设置并贯穿整个程序。 - quetzal
这个提示可能无法修复崩溃问题,但我认为您应该始终检查* malloc()*的返回值。您能否发布更多代码以便我们尝试帮助您? - Cacho Santa
显示剩余2条评论
4个回答

5
你分配的是数据结构的空间,应该使用 sizeof(data) 而不是 sizeof(data*),这样是否更合适?

谢谢,我刚刚再试了一次,但还是崩溃了。也许我的malloc正在尝试分配已经被使用的空间? - quetzal
1
如果你所说的标题中实际的malloc()调用崩溃了,那么很可能是你已经覆盖了堆的某些部分,可能是在某个地方分配了太少的内存,或者使用了已经被释放的内存。我建议在崩溃的malloc()之前查看最近一次使用malloc()分配的内存。 - Joachim Isaksson
谢谢,我认为这是最好的方法,我现在正在研究它! - quetzal
感谢Joachim的帮助,最终问题出在我在for循环中输入了一个太大的数字,导致程序试图将整数放入未分配内存的位置,最终导致了崩溃。这个错误看起来很愚蠢,但是这也是一次很好的学习经验,同时也让我知道我之前分配了过多的内存! - quetzal

1

您正在分配 m * ndata * 元素而不是 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!
}

你的程序有可能会崩溃。但是当你说“它之前可以运行,但后来崩溃了”时,我开始做一些实验。我尝试了你的代码片段,并发现它对我有效。我尝试了很多次,但它从未崩溃过。我感到困惑,于是我发布了一个问题来找出原因!- 它在这里“malloc(sizeof(struct a *))”和“malloc(sizeof(struct a))”是否相同? +1给你的问题!

嘿嘿,很高兴看到有所收获 :) - quetzal
1
不错。对于那个问题有一个很好的解释。请查看!每天都有新东西可以学习 :) - Sangeeth Saravanaraj

0

你们说得都没错,但我还是不明白为什么会崩溃。

我之所以想知道是因为上面定义的 data 的大小应该小于或等于 data* 的大小。


是的,这正是我所想的。我可以理解为什么反过来会出错,但为什么分配比所需空间更多的空间会导致崩溃呢? - quetzal

0

当malloc崩溃时,通常是因为您在堆上跟踪内存的结构出现了问题。您的程序是否多线程?尝试使用helgrind或drd(两个valgrind工具)运行它。这些工具可以帮助您跟踪竞争条件、未受保护的数据访问或其他线程问题。


嗨dbeer,我的程序在那个点上还没有多线程,当我将这个新数组传输到GPU进行计算时,它才变成了多线程,但在这个版本中它还没有被创建。奇怪的是,在2D中整个程序都运行得很好,但我正在尝试将我的数组压平,因为这样更容易将它们移动到GPU上。 - quetzal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接