我正在尝试使用realloc在堆上扩展一个int数组,但是当我使用自定义函数“ExpandArrayOfInts”时程序崩溃但是当我在main中编写扩展器代码时工作正常。
以下是两种方法的#defines代码(文件:main.c)。
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int ExpandArrayOfInts(int* arrayToExpand, int expandBy, int inArraySize, int* outArraySize);
int main (int argc, char** argv)
{
#if 1//CODE THAT WORKS
int arraySize = 10;
int* arrayDnmc = NULL;
int* arrayDnmcExpndd;
for (int i = 0; i< 10; ++i)
{
arrayDnmcExpndd = (int*)realloc(arrayDnmc, (arraySize + (i * 10)) * sizeof(int));
if (arrayDnmcExpndd != NULL)
{
arrayDnmc = arrayDnmcExpndd;
memset(arrayDnmc, 0, (arraySize + (i * 10)) * sizeof(int));
}
else
{
printf("Failed to (re)alloc memory for arrayDnmc!\n");
free(arrayDnmc);
return -1;
}
}
free(arrayDnmc);
#else //CODE THAT DOESN'T WORK (Which I'm trying to make it work)
int maxSize = 100;
int arraySize = 10;
int* arrayDnmc = NULL;
arrayDnmc = (int*)malloc(arraySize * sizeof(int));
if (arrayDnmc != NULL)
{
memset(arrayDnmc, 0, arraySize * sizeof(int));
}
else
{
printf("malloc failure!\n");
return -1;
}
while (arraySize < maxSize)
{
if (0 != ExpandArrayOfInts(arrayDnmc, 5, arraySize, &arraySize))
{
printf("Something went wrong.\n");
break;
}
//do something with the new array
printf("new size: %i\n", arraySize);
}
free(arrayDnmc);
#endif
return 0;
}
int ExpandArrayOfInts(int* arrayToExpand, int expandBy, int inArraySize, int* outArraySize)
{
int newSize = inArraySize + expandBy;
int* arrayTemp = (int*)realloc(arrayToExpand, newSize * sizeof(int));
if (arrayTemp != NULL)
{
arrayToExpand = arrayTemp;
*outArraySize = newSize;
return 0;
}
return -1;
}
不起作用的部分提供以下输出:
新尺寸:15
新尺寸:20
然后我收到崩溃消息:
“Windows在c_cplusplus_mixing.exe中触发了断点。 这可能是由于堆的损坏,这表明c_cplusplus_mixing.exe或其加载的任何DLL中存在错误。 这也可能是由于用户在c_cplusplus_mixing.exe具有焦点时按下F12。 输出窗口可能包含更多诊断信息。“
调用堆栈似乎没有意义(至少对于像我这样的新手而言) 调用堆栈:
ntdll.dll!775c542c()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!7758fdd0()
ntdll.dll!7755b3fc()
注意,我正在使用visual studio 2008并运行Debug build。 (释放也不起作用。) 谁能指点我到哪里错了!如果需要更多细节,请告诉我。
非常感谢提前,
哈桑。
答案 0 :(得分:3)
问题是ExpandArrayOfInts正在接收一个指向int的指针,而不是指向必须重新分配的指针的指针。它应该是这样的:
int ExpandArrayOfInts(int** arrayToExpand, int expandBy, int inArraySize, int* outArraySize)
然后你会这样称呼它:
ExpandArrayOfInts(&arrayDnmc, 5, arraySize, &arraySize))
我建议你在stackoverflow中查找与指针相关的问题,以便更好地理解它们。
答案 1 :(得分:1)
从我系统上的realloc()
文档:
realloc()返回指向的指针 新分配的内存,即 适合任何种类的 变量和可能不同 ptr ,如果请求失败,则为NULL。
您的ExpandArrayOfInts()
声明和实现不允许realloc修改main()
中的实际指针 - 它隐含地假设其值不能更改。当realloc()
移动内存区域并且执行返回不同的指针时,它会在调用它的指针上调用free()
。但是,你的程序的其余部分继续使用现在无效的原始值,因此崩溃。
您应该使用指针指针通过引用传递内存区域指针,而不是:
int ExpandArrayOfInts(int** arrayToExpand, int expandBy, int inArraySize, int* outArraySize)
.
.
.
*arrayToExpand = (int*)realloc(*arrayToExpand, newSize * sizeof(int));