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;