我正在尝试使用动态内存分配编写代码,并面临在genPointLinkArray()
中调用realloc()
时,程序抛出异常的问题: ConsoleApplication1.exe 已触发断点
。
我正在使用 Visual Studio 15 并在 Debug模式下运行该程序。
struct graphPoint
{
point p;
int value;
};
struct graphLink
{
point start;
graphPoint end;
};
graphLink* genPointLink(char map[10][10], point start, graphPoint primaryPoint[22], int *linksNum)
{
graphLink *lin = (graphLink*)0;
(*linksNum) = 0;
for (int i = 0; i < 22; i++)
{
if (!ifWay(map, start, primaryPoint[i].p))
{
(*linksNum)++;
if(*linksNum == 1)
lin = (graphLink*)malloc(sizeof(graphLink));
else
{
lin = (graphLink*)realloc(lin, (*linksNum) * sizeof(graphLink));
}
(lin + (*linksNum - 1))->start = start;
(lin + (*linksNum - 1))->end = primaryPoint[i];
}
}
return lin;
}
graphLink* genPointLinkArray(char map[10][10], graphPoint primaryPoint[22], int *linksNum)
{
graphLink *links = (graphLink*)0, *l;
int currentNum = 0;
*linksNum = 0;
for (int i = 0; i < 22; i++)
{
l = genPointLink(map, primaryPoint[i].p, primaryPoint, ¤tNum);
if(currentNum != 0)
if (*linksNum == 0)
links = (graphLink*)calloc(currentNum, sizeof(graphLink));
else
links = (graphLink*)realloc(links, ((currentNum + *linksNum) * sizeof(graphLink)));
*linksNum = *linksNum + currentNum;
for (int i = 0; i < currentNum; i++)
{
links[*linksNum - 1 + i].end = l[i].end;
links[*linksNum - 1 + i].start = l[i].start;
}
}
for (int i = 0; i < *linksNum; i++)
{
printf("(%d ; %d) -> (%d ; %d) : %d\n", links[i].start.x, links[i].start.y, links[i].end.p.x, links[i].end.p.y, links[i].end.value);
}
return links;
}
最佳答案
您的问题是以下代码部分
*linksNum = *linksNum + currentNum;
for (int i = 0; i < currentNum; i++)
{
links[*linksNum - 1 + i].end = l[i].end;
links[*linksNum - 1 + i].start = l[i].start;
}
您更新了*linksNum
在循环之前,因此在循环内您正在寻址 links
“数组”越界:未定义的行为。
关于c - 动态内存C、realloc异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40592789/