Malloc呼叫崩溃,但在其他地方工作

Malloc呼叫崩溃,但在其他地方工作,c,crash,malloc,C,Crash,Malloc,我想知道是否有人对此有任何见解 我的程序在此呼叫中崩溃: void subtract(data* array,data* inverse,int a, int b, int q, int n) { data* arraytomultiply; arraytomultiply = (data *)malloc(sizeof(data*) * n); 其中数据只包含一个int(为了方便以后切换类型) 我尝试了很多改变指针的方法,因为我对它们一点也不自信,但都没有用 奇怪的是,在程序的早期,同一个

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

我的程序在此呼叫中崩溃:

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

data* arraytomultiply;
arraytomultiply = (data *)malloc(sizeof(data*) * n);
其中数据只包含一个int(为了方便以后切换类型)

我尝试了很多改变指针的方法,因为我对它们一点也不自信,但都没有用

奇怪的是,在程序的早期,同一个调用可以工作,我给它赋值,并可以打印出它们和所有东西

data* array;
array = (data*)malloc(sizeof(data*) * m * n); // m * n entries
一件可能有用的事情(尽管我不知道为什么)是,当它在早期工作时,它在一个void函数中,而当它崩溃时,它在一个从算法中调用的函数中。但我不知道这会对它有什么影响,因为我想做的是不使用任何参数等等


有什么想法吗?

既然您正在为数据结构分配空间,那不应该是sizeof(数据)而不是sizeof(数据*)吗?

您正在分配
m*n
元素的
数据*
。如果需要指向
数据的指针数组
,则在
malloc()
中执行的操作是正确的,但应将其分配给
数据**

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!
}

你的程序完全有理由崩溃。但是当你说,
它工作得更早,但后来崩溃了
是为了做一些实验。我尝试了你的代码片段,发现它对我有用。我试了很多次,但都没有失败。我很困惑,我贴了一个问题来找出原因这里有


+1.回答你的问题

你们都是对的,但不管怎样,我想知道为什么会崩溃


我想知道的是,当malloc崩溃时,
数据
(如上定义)的大小预计会小于或等于
数据*

的大小,这通常是因为你弄乱了它用来跟踪堆上其他地方内存的结构。你的程序是多线程的吗?尝试使用helgrind或drd(两种valgrind工具)运行它。这些可以帮助您跟踪竞争条件、未受保护的数据访问或其他线程问题。

谢谢,我刚刚又尝试了一次,但还是一样的崩溃。也许我的malloc正在试图分配已经在使用的空间或其他什么?如果是像你在标题中所说的实际malloc()调用崩溃,你很可能已经覆盖了堆的一部分,要么是分配了太少的内存,要么是使用了已经空闲的内存。在malloc()崩溃之前,我会先看看malloc()d内存的最新使用情况。谢谢,我认为这是最好的方法,我现在就来看看!谢谢你的约阿希姆;结果是在其他地方,我只是在for循环中输入了太多的数字,所以它试图在没有分配内存的地方输入整数,我猜这导致了后来的崩溃。结果证明这很愚蠢,但这是一次很好的学习经历,很高兴知道我分配了太多的内存!是的,这就是我所想的,我可以理解为什么它会反过来出错,但为什么它会崩溃,分配的空间比需要的多。
malloc
崩溃时,几乎总是因为内存早些时候被破坏。我打赌数据是在先前
malloc
ed的数据块之前或之后立即写入的。啊,也许是这样,我会回到先前的malloc并检查它们,谢谢:)你有崩溃的核心文件吗?如果您这样做,并粘贴回溯跟踪,将有助于诊断问题。根据合理的限制进行检查。除了内存损坏之外,我还看到,由于一些未初始化的变量,当分配的字节数非常大时,这种方法会失败。由于n是从函数调用传入的,因此检查其值是一种很好的编程实践。dbeer,我该如何找到它?我通常使用GDB进行调试,但最近我不得不使用VS2010切换到windows-这是我第一个使用它的程序!卢:谢谢,但是n是由用户在开始时设置的,并执行程序。嗨,dbeer,我的程序没有多线程,当我将这个新数组转移到GPU进行计算时,它是多线程的,但在这个版本中它没有创建它。奇怪的是,整个东西在2d中运行得很好,但我正在尝试将我的阵列展平,因为这样更容易将它们移动到GPU上..呵呵,很高兴看到它产生了一些效果:)很好。这个问题有很好的解释。请退房!每天都要学的新东西:)
if ((array = (data*)malloc(sizeof(data) * m * n)) == NULL) {
    printf("unable to allocate memory");
    return; // you can return your error code here!
}