c - 动态内存C、realloc异常

标签 c dynamic-memory-allocation

我正在尝试使用动态内存分配编写代码,并面临在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, &currentNum);
        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/

相关文章:

c - 使用 unix 函数在 OSX 下移动/复制文件

c - 将 4 个字符解释为整数

c - 如何分别存储括号和数字?

c - 内存的静态和动态分配

C 将动态字符数组转换为字符数组

C 循环中断子句

c - 03优化后如何列出任意c程序使用的所有库函数

c - 什么更有效率 : reading from a file or allocating memory

C比较2个字符串变成了内存分配问题

c++ - C/C++如何知道动态分配的数组有多长