鱼C论坛

 找回密码
 立即注册
查看: 5910|回复: 12

[已解决]VS2022引发了未经处理的异常:读取访问权限冲突。 **p** 是 0xFFFFFFFFFFFFFFF7。

[复制链接]
发表于 2022-3-18 00:46:04 | 显示全部楼层 |阅读模式
5鱼币
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)

typedef struct ListNode
{
        struct ListNode* prior;
        char x;
        struct ListNode* next;
}ListNode;

ListNode* creat()
{
        ListNode *p, *q, * head;;
        int i;
        p = (ListNode*)malloc(sizeof(ListNode));
        head = p;
        p->next = p->prior = NULL;
        for (i = 0; i < 26; i++)
        {
                q = (ListNode*)malloc(sizeof(ListNode));
                q->x = 'A' + i;
                q->prior = p;
                p->next = q;
                p = q;
        }
        head->next->prior = p;
        return head->next;
}
int main()
{
        ListNode* head = creat();
        ListNode* p;
        int i, b;
        p = head;
        printf("请输入数字 : ");
        b = scanf("%d", &b);
        if (b > 0)
        {
                do
                {
                        p = p->next;
                } while (b--);
                for (i = 0; i < 26; i++)
                {
                        printf("%c ", p->x);
                        p = p->next;
                }
        }
        else
        {
                b = -b;
                do
                {
                        p = p->next;
                } while (b--);
                for (i = 0; i < 26; i++)
                {
                        printf("%c ", p->x);
                        p = p->next;
                }
        }
       
        return 0;
}
最佳答案
2022-3-18 00:46:05
本帖最后由 jhq999 于 2022-3-18 20:47 编辑
sunjiam 发表于 2022-3-18 20:22
好神奇,大佬可以具体说一下为什么吗


head<->a<->b<->c<->……<->z
这时候p=z//大概意思
head->next->prior = p;//a->prior=z
p->next=head->next;//z->next=a
free(head);//没用了痛快释放,要不然可能造成内存泄漏
这样就形成了双向循环链表
return p->next;//返回a

最佳答案

查看完整内容

headabc……z 这时候p=z//大概意思 head->next->prior = p;//a->prior=z p->next=head->next;//z->next=a free(head);//没用了痛快释放,要不然可能造成内存泄漏 这样就形成了双向循环链表 return p->next;//返回a
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-18 00:46:05 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2022-3-18 20:47 编辑
sunjiam 发表于 2022-3-18 20:22
好神奇,大佬可以具体说一下为什么吗


head<->a<->b<->c<->……<->z
这时候p=z//大概意思
head->next->prior = p;//a->prior=z
p->next=head->next;//z->next=a
free(head);//没用了痛快释放,要不然可能造成内存泄漏
这样就形成了双向循环链表
return p->next;//返回a

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-18 06:36:42 | 显示全部楼层
ListNode* creat()
{
        ListNode *p, *q, * head;;
        int i;
        p = (ListNode*)malloc(sizeof(ListNode));
        head = p;
        //p->next = p->prior = NULL;
        for (i = 0; i < 26; i++)
        {
                q = (ListNode*)malloc(sizeof(ListNode));
                q->x = 'A' + i;
                q->prior = p;
                p->next = q;
                p = q;
        }
        head->next->prior = p;
        p->next=head->next;/////
        free(head);//////////
        return p->next;//////////
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-18 20:22:55 | 显示全部楼层

好神奇,大佬可以具体说一下为什么吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-18 20:30:13 | 显示全部楼层

        p->next = head->next;
        free(p);
        return head->next;
我这样free就是错误的到底是为啥啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-18 20:34:58 | 显示全部楼层
sunjiam 发表于 2022-3-18 20:30
p->next = head->next;
        free(p);
        return head->next;

经过p->next = q; p = q;已经不等于head了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-18 20:40:10 | 显示全部楼层
jhq999 发表于 2022-3-18 20:34
经过p->next = q; p = q;已经不等于head了

        head->next->prior = p;
        free(p);
        return head->next;
我直接释放掉p不可以吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-18 20:40:46 | 显示全部楼层
我初学,这个free()到底怎么用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-18 20:42:58 | 显示全部楼层
free(p);
释放的是指针p所指向的内存空间吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-18 20:47:58 | 显示全部楼层
jhq999 发表于 2022-3-18 20:44
headabc……z
这时候p=z//大概意思
head->next->prior = p;//a->prior=z

懂了懂了
这个漏了p->next=head->next;//z->next=a
哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-18 20:49:56 | 显示全部楼层
jhq999 发表于 2022-3-18 20:44
headabc……z
这时候p=z//大概意思
head->next->prior = p;//a->prior=z

我还有一个问题
我在这里手动释放free(p)
p->next=head->next;//z->next=a
这样子p指向的内个内存空间就被释放了,可能会被垃圾值覆盖是吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-18 21:20:01 | 显示全部楼层
sunjiam 发表于 2022-3-18 20:49
我还有一个问题
我在这里手动释放free(p)
p->next=head->next;//z->next=a

可能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-18 21:22:40 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 06:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表