关于#NULL#的问题,如何解决?


void borrow_book() {//借书函数
    system("cls");
    char student_id[20]; 
    char book_id[20];
    int id;
    printf("请输入书籍编号和学生学号: \n");
    scanf("%d %s", &id, &student_id);
    for (int i = 0; i < book_count; i++) {
        if (strcmp(book_id,books[i].id)==0&& books[i].available==1) {
            books[i].available = 0;
            MessageBox(NULL,"借阅成功","温馨提示",MB_OK+MB_ICONQUESTION);
            for (int j = 0; j < student_count; j++) {
                if (strcmp(students[j].id,student_id)==0) {
                    for (int k = 0; k < MAX_BOOKS; k++) {
                        if (students[j].borrowed_books[k] == 0) {
                           students[j].borrowed_books[k]=id;
                            break;
                        }
                    }
                    break;
                }
            }
            break;
        }
        if (strcmp(book_id,books[i].id)!=0|| books[i].available==0)
            MessageBox(NULL,"此书已被借阅或书籍编号错误","借阅失败",MB_OK+MB_ICONQUESTION);
    }
}
if (strcmp(book_id,books[i].id)==0&& books[i].avalable==1) 

这句代码无法运行

你这 book_id 都没赋值,比了个寂寞呀

img


scanf("%d %s", &id, &student_id);

这一行有问题哦!修改如下所示:


scanf("%d %s", &id, student_id);
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7459026
  • 这篇博客也不错, 你可以看下关于空指针NULL
  • 你还可以看下c语言参考手册中的 实现定义的空指针常量 (宏常量)-NULL
  • 除此之外, 这篇博客: 关于指针赋初值为NULL的问题中的 关于指针赋初值为NULL的问题 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 因为NULL本质就是0,则,一个指针变量的值为0,意味着它指向整个内存的最开始字节处,而这个地方是用户程序(APP)的禁区,不能访问,如果强行访问,则,将被OS禁止并中断这个进程执行(程序被中断)。

    上述说法,不能说指针的值不能为NULL,只是说,不能对0编号开始的空间进行“访问”。即,可以令指针指向0编号区域,只要不访问就没有问题。

    【软件工程】建议所有的变量(尤其是局部变量)都应该初始化为0(NULL)。这里,对于指针变量初始化为NULL的目的在于:区分垃圾数据!

    int *p;

    int x;

    if(x > 0)

    p = (int *)malloc(…);

    x = …;

    // 在此处,无法识别p是否已经指向一段申请了的空间!

    if(p是否指向了有效空间)

    此时无法判断p是否指向了有效空间,为此,需要进行如下调整:

    int *p = NULL;

    int x;

    if(x > 0)

    p = (int *)malloc(…);

    x = …;

    if(p == NULL)

    // p没有指向有效空间

    else

    // p指向了有效空间