You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用scanf()读取第三个解引用整数时程序崩溃,如何修复?

scanf读取整数超时/无法执行到后续代码的问题

问题代码及现象

第一段代码:

int main(int argc, char *argv[]) {
    int *v1, *v2, *v3;
    printf("Enter three integers: ");
    scanf("%d %d %d", v1, v2, v3);
    printf("We made it this far?\n");
    /* Other stuff after */
    return 0;
}

现象:输入任意三个整数时,程序看似能给*v1、*v2赋值,但给v3分配第三个整数时会超时;输入超过三个整数也会出现同样问题,从未执行到调试打印语句"We made it this far?"。

拆分逐个读取的代码:

int main(int argc, char *argv[]) {
    int *v1;
    int *v2;
    int *v3;
    printf("Enter three integers: ");
    scanf("%d ", v1);
    printf("%d\n", *v1);
    scanf("%d ", v2);
    printf("%d\n", *v2);
    scanf("%d\n", v3);
    printf("%d\n", *v3);
    printf("We made it this far?\n");
    return 0;
}

现象同样是无法执行到最后的打印语句,无论变量名、输入内容如何都会出现问题。

问题原因

  1. 野指针导致的未定义行为:
    v1、v2、v3都是int*类型的指针,但声明后没有指向任何有效的内存地址,属于野指针。scanf的%d格式需要传入变量的内存地址,这里直接传入野指针,会导致程序向非法内存地址写入数据,触发未定义行为——前两次操作可能看似正常,但实际上已经破坏了内存,第三次操作就会导致程序崩溃或卡住。

  2. scanf格式字符串的多余空白字符:
    拆分后的代码中,scanf的格式字符串带有空格(%d )或换行(%d\n),scanf会将格式中的空白字符视为匹配任意数量的空白字符(包括空格、换行、制表符等),所以输入完数字后,程序会持续等待,直到遇到非空白字符,这也是导致"超时"的直接原因之一。

解决方案

方案1:使用普通int变量(最常用的正确写法)

将指针替换为普通int变量,通过&取地址符传入scanf:

#include <stdio.h>

int main(int argc, char *argv[]) {
    int v1, v2, v3;
    printf("Enter three integers: ");
    scanf("%d %d %d", &v1, &v2, &v3);
    printf("We made it this far?\n");
    printf("输入的三个数:%d, %d, %d\n", v1, v2, v3);
    return 0;
}

方案2:给指针分配有效内存(如果必须使用指针)

通过malloc为指针分配内存,使用完后记得释放:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int *v1 = malloc(sizeof(int));
    int *v2 = malloc(sizeof(int));
    int *v3 = malloc(sizeof(int));
    
    // 检查内存分配是否成功
    if (!v1 || !v2 || !v3) {
        printf("内存分配失败\n");
        return 1;
    }

    printf("Enter three integers: ");
    scanf("%d %d %d", v1, v2, v3);
    printf("We made it this far?\n");
    printf("输入的三个数:%d, %d, %d\n", *v1, *v2, *v3);

    // 释放分配的内存
    free(v1);
    free(v2);
    free(v3);
    return 0;
}

拆分读取的正确写法

去掉scanf格式字符串中的多余空格和换行:

#include <stdio.h>

int main(int argc, char *argv[]) {
    int v1, v2, v3;
    printf("Enter three integers: ");
    scanf("%d", &v1);
    printf("%d\n", v1);
    scanf("%d", &v2);
    printf("%d\n", v2);
    scanf("%d", &v3);
    printf("%d\n", v3);
    printf("We made it this far?\n");
    return 0;
}

内容的提问来源于stack exchange,提问作者SomethingLikeThat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:00:27