sunjiam 发表于 2022-3-18 00:46:04

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

#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;
}

jhq999 发表于 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

jhq999 发表于 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;//////////
}

sunjiam 发表于 2022-3-18 20:22:55

jhq999 发表于 2022-3-18 06:36


好神奇,大佬可以具体说一下为什么吗

sunjiam 发表于 2022-3-18 20:30:13

jhq999 发表于 2022-3-18 06:36


        p->next = head->next;
        free(p);
        return head->next;
我这样free就是错误的到底是为啥啊

jhq999 发表于 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了

sunjiam 发表于 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不可以吗

sunjiam 发表于 2022-3-18 20:40:46

我初学,这个free()到底怎么用了

sunjiam 发表于 2022-3-18 20:42:58

free(p);
释放的是指针p所指向的内存空间吗

sunjiam 发表于 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
哈哈

sunjiam 发表于 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指向的内个内存空间就被释放了,可能会被垃圾值覆盖是吗

jhq999 发表于 2022-3-18 21:20:01

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


可能

hornwong 发表于 2022-3-18 21:22:40

{:5_95:}
页: [1]
查看完整版本: VS2022引发了未经处理的异常:读取访问权限冲突。 **p** 是 0xFFFFFFFFFFFFFFF7。