vs2019出现问题 引发了异常: 写入访问权限冲突。 **q** 是 0x4A1258。

因为写入访问权限受阻而无法成功输入数据。之前曾经写过另外一个方法,那个方法是将首指针也存入了数据,但是我将输入的数据即时输出(即读入)时是正确的,后面进行交换却是错的,因此重新写了一份,也就是这一份,首指针为空不存入数据,输入后后面交换时数值时正确的(调试),但是一到后面就不对了,查了csdn的相关类似问题,结果就是大部分都是数组越界,但是我检查了逻辑,确实是写一个就加一个,应该不可能越界,其他答案也无法解决我的问题。想要一份通俗易懂些的答案,之前都没接触过链表,实在是搞不明白到底哪里错了。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
# define WHY printf("***\n");
#pragma warning (disable:4996)
typedef struct ren//创建结构体
{
    char n[20];
    char sex;
    int cg;
    struct ren* next;
}STU;
STU* create()
{
    STU* head;
    head = (STU*)malloc(sizeof(STU));
    head->next = NULL;
    return head;
}
void new(STU* qH, int* c){
    STU * q = qH,*qb;
    printf("请输入数据\n");
    STU* p = (STU*)malloc(sizeof(STU));
    if (NULL == p)
    {
        printf("malloc error!\n");
        return NULL;
    }
    printf("成绩:\t");
    scanf("%d", &(p->cg));
    printf("成绩\t\n");
    printf("%d\t\n", p->cg);
    p->next = NULL;
    (*c)++;
    int n, i;
    if ((*c) == 1)
        {
            q->next = p;//报错处
            p->next = NULL;
        }
    else {
        while (NULL != q->next)
        {
            q = q->next;
        }
        p->next = q->next;
        q->next = p;
        }
}

void main()
{
    int count = 0, a = 1, * c;
    c = &count;
    struct ren* q = create;
    while (a)//重复使用
    {
    int a;
    printf("输入1添加新学生\n ");
    scanf("%d", &a);
    switch (a)
    {
    case 1:new(q, c); break;//计数几个人
    case 6:break;
    }
}
}

以上是实际使用的部分代码

img

以上是结果

最终我还是解决了问题,我放到dev里跑了,结果就是应该用c++而非C语言,因此困扰我这么久的问题就是我受我们课上的是C语言,没想过应该改成c++

第46行删掉

问题见注释,供参考:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
# define WHY printf("***\n");
#pragma warning (disable:4996)
typedef struct ren//创建结构体
{
    char n[20];
    char sex;
    int cg;
    struct ren* next;
}STU;
STU* create()
{
    STU* head;
    head = (STU*)malloc(sizeof(STU));
    head->next = NULL;
    return head;
}
void new_input(STU* qH, int* c){
    STU * q = qH,*qb;
    printf("请输入数据\n");
    STU* p = (STU*)malloc(sizeof(STU));
    if (NULL == p)
    {
        printf("malloc error!\n");
        return;                   //return NULL;
    }
    printf("成绩:\t");
    scanf("%d", &p->cg);          //scanf("%d", &(p->cg));
    printf("成绩\t\n");
    printf("%d\t\n", p->cg);
    p->next = NULL;
    (*c)++;
    int n, i;
    if ((*c) == 1)
        {
            q->next = p;//报错处
            p->next = NULL;
        }
    else {
        while (NULL != q->next)
        {
            q = q->next;
        }
        p->next = q->next;
        q->next = p;
        }
}

void print(STU *qH)
{
    STU *p = qH->next;
    while(p)
    {
        printf("%d ",p->cg);
        p =p->next;
    }
    printf("\n");
}

void main()
{
    int count = 0, a = 1, * c;
    c = &count;
    struct ren* q = create();     //struct ren* q = create;
    while (a)//重复使用
    {
                                  //int a;
        printf("输入1添加新学生\n ");
        scanf("%d", &a);
        switch (a)
        {
              case 1:new_input(q, c); break;//计数几个人
              case 6:print(q);break;
        }
    }
}