Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法处理异常:读取权限冲突,指针值超出限制_C++ - Fatal编程技术网

C++ 无法处理异常:读取权限冲突,指针值超出限制

C++ 无法处理异常:读取权限冲突,指针值超出限制,c++,C++,void TableInsert(SLinkListType&L,红色类型d[],内部n) /* 由数组D建立N个元素的表插入排序的静态链表L*/ { inti,p,q; L.r[0].rc.key=INT_MAX; L.r[0].next=0; 对于(i=0;i代码>的赋值尚未执行,所以代码> ADR < /C>是一个未初始化的值,如果你走到下一行,它将是空的。在一些不相关的注释中:在C++中不要使用 null < /C>或 MalOC 。如果需要使用指针,则使用新[]。分配。在这里,您根本不

void TableInsert(SLinkListType&L,红色类型d[],内部n)
/* 由数组D建立N个元素的表插入排序的静态链表L*/
{
inti,p,q;
L.r[0].rc.key=INT_MAX;
L.r[0].next=0;
对于(i=0;i而(L.r[p].rc.key如果我理解正确,您正在调试程序中单步执行代码,并在第行停止

void TableInsert(SLinkListType &L, RedType d[], int n)
/* 由数组D建立n个元素的表插入排序的静态链表L */
{
    int i, p, q;
    L.r[0].rc.key = INT_MAX;
    L.r[0].next = 0;
    for (i = 0; i < n; i++)
    {
        L.r[i + 1].rc = d[i];
        q = 0;
        p = L.r[0].next;
        while (L.r[p].rc.key <= L.r[i + 1].rc.key)
        {
            q = p;
            p = L.r[p].next;
        }
        L.r[i + 1].next = p;
        L.r[q].next = i + 1;
    }
    L.length = n;
}//TableInsert

void Arrange(SLinkListType &L)
{
    int i, p, q;
    SLNode t;
    p = L.r[0].next;
    for (i = 1; i < L.length; i++)
    {
        while (p < i)
            p = L.r[p].next;
        q = L.r[p].next;
        if (p != i)
        {
            t = L.r[p];             /* 交换记录,使第i个记录到位 */
            L.r[p] = L.r[i];
            L.r[i] = t;
            L.r[i].next = p;
        }
        p = q;                      /* p指示尚未调整的表尾,为找第i+1个记录作准备 */
    }
}//Arrange

void Sort(SLinkListType L, int adr[])
/* 求得adr[1..L.length],adr[i]为静态链表L的第i个最小记录的序号 */
{
    int i = 1, p = L.r[0].next;
    while (p)
    {
        adr[i++];
        p = L.r[p].next;
    }
}//Sort

void ReArrange(SLinkListType &L, int adr[])
/* adr给出静态链表L的有序次序,即L.r[adr[i]]是第i小的记录。 */
{
    int i, j, k = 0;
    for (i = 1; i < L.length; i++)
    {
        if (adr[i] != i)
        {
            j = i;
            L.r[0] = L.r[i];
            while (adr[j] != i)
            /* 调整(*L).r[adr[j]]的记录到位直到adr[j]=i为止 */
            {
                k = adr[j];
                printf("%d", k);
                /* 如:adr[1] = 6,则 K = 6,将 r[6] 赋值到 r[1], 同时同步adr[], 然后将 adr[1] 移动 adr[6]*/

                L.r[j] = L.r[k];        /* L.r[j] = L.r[adr[j]] */
                adr[j] = j;
                j = k;                  /* 记录按序到位 */
            }
            L.r[j] = L.r[0];            /* L.r[6] = L.r[0] */
            adr[j] = j;                 /* 同步 adr[] */
        }
    }
}//ReArrange

void Print(SLinkListType L)
{
    int i;
    for (i = 1; i <= L.length; i++)
    {
        printf("key=%d ord=%d next=%d\n", L.r[i].rc.key, L.r[i].rc.otherinfo, L.r[i].next);
    }
}//Print

#define N 8

    void main()
    {
        RedType d[N] = { {49,1},{38,2},{65,3},{97,4},{76,5},{13,6},{27,7},{49,8} };
        SLinkListType a, b;
        int *adr = NULL, i = 0;         /* 内存分配有误,adr 的值超出范围  */
        TableInsert(a, d, N);
        b = a;          /* 复制静态链表l2与l1相同 */
        printf("排序前:\n");
        Print(a);
        Arrange(a);
        printf("a排序后:\n");
        Print(a);
        adr = (int *)malloc((b.length + 1) * sizeof(int));
        Sort(b, adr);
        for (i = 1; i <= b.length; ++i)
        {
            printf("adr[%d] = %d", i, adr[i]);
        }
        printf("\n");
        ReArrange(b, adr);
        printf("b排序后:\n");
        Print(b);
    }
想知道为什么
adr
不是空指针

那是因为初始化还没有发生。如果您再进行一步,初始化就会发生,
adr
应该变成
NULL
而不是“int
*adr=NULL;”
,请尝试使用 int*adr
adr=newint;

如果使用
int*adr=NULL
,将导致内存不足。
adr=new int;
-创建新的动态内存。NULL用于删除指针之后!!!

跳入未注释的代码感觉如何:,因为您喜欢图像。但现在说真的,不要发布图像,而是复制粘贴文本。
void main
格式不正确C++是您的问题,为什么
adr
具有无效的v在调试时,在屏幕截图中,对<代码> null >代码>的赋值尚未执行,所以代码> ADR < /C>是一个未初始化的值,如果你走到下一行,它将是空的。在一些不相关的注释中:在C++中不要使用<代码> null < /C>或<代码> MalOC 。如果需要使用指针,则使用<代码>新[]。
分配。在这里,您根本不需要使用指针和自己的显式动态分配,使用。
int *adr = NULL, i = 0;