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 * n
个data *
元素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工具)运行它。 这些可以帮助您跟踪竞争条件,无保护的数据访问或其他线程问题。