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

使用scanf()读取动态分配一维、二维表时触发Segmentation Fault 11错误的求助

解决动态分配二维数组时的Segmentation Fault 11错误

你的代码逻辑框架是对的,但崩溃在cost[0][1],大概率是数组越界访问或者输入数据不符合预期导致的,下面一步步分析和解决:

可能的原因

  • 输入数据不匹配:比如你尝试读取cost[0][1],但输入的number_of_models[0]的值是1(甚至更小),这时候cost[0]只被分配了1个int的空间,访问cost[0][1]就会越界,触发段错误。
  • malloc(0)的未定义行为:如果某个number_of_models[i]是0,malloc(0)的行为是实现定义的,可能返回NULL或者一个无法访问的指针,后续读取操作也会崩溃。
  • 输入读取失败:如果scanf没有成功读取到预期的数值(比如输入了非数字字符),number_of_models[i]会被保留为随机垃圾值,后续malloc的空间大小错误,也会导致越界。

修复方案

1. 验证输入数据的合法性

在分配cost[i]之前,先检查number_of_models[i]是否大于0,避免无效的内存分配:

scanf("%d", &number_of_models[i]);
// 检查输入的模型数量是否合法
if (number_of_models[i] <= 0) {
    fprintf(stderr, "Invalid number of models for product %d\n", i);
    // 可以选择清理已分配的内存后退出
    return -1;
}
cost[i] = malloc(number_of_models[i] * sizeof(int));

2. 检查scanf的返回值

确保每次scanf都成功读取到了预期的数值,避免因为输入错误导致变量值异常:

// 读取预算和产品数量
if (scanf("%d %d", &budget, &number_of_products) != 2) {
    fprintf(stderr, "Failed to read budget and product count\n");
    return -1;
}

// 读取每个产品的模型数量
if (scanf("%d", &number_of_models[i]) != 1) {
    fprintf(stderr, "Failed to read model count for product %d\n", i);
    return -1;
}

// 读取每个模型的成本
if (scanf("%d", &cost[i][j]) != 1) {
    fprintf(stderr, "Failed to read cost for product %d model %d\n", i, j);
    return -1;
}

3. 添加内存清理逻辑(可选但推荐)

如果在分配过程中出现错误,需要释放已经分配的内存,避免内存泄漏:

// 比如在某个cost[i]分配失败时:
if (cost[i] == NULL){
    // 先释放之前分配的cost[0]到cost[i-1]
    for (int k = 0; k < i; k++) {
        free(cost[k]);
    }
    free(cost);
    free(number_of_models);
    return -1;
}

修改后的完整代码

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

int main (void){
    int *number_of_models, **cost, budget, number_of_products, i, j;

    // 读取预算和产品数量,检查读取结果
    if (scanf("%d %d", &budget, &number_of_products) != 2) {
        fprintf(stderr, "Error: Failed to read budget and product count\n");
        return -1;
    }

    number_of_models = malloc(number_of_products * sizeof(int));
    if (number_of_models == NULL){
        fprintf(stderr, "Error: Failed to allocate memory for number_of_models\n");
        return -1;
    }

    cost = malloc(number_of_products * sizeof(int*));
    if (cost == NULL){
        fprintf(stderr, "Error: Failed to allocate memory for cost\n");
        free(number_of_models);
        return -1;
    }

    for (i = 0; i < number_of_products; i++){
        // 读取当前产品的模型数量
        if (scanf("%d", &number_of_models[i]) != 1) {
            fprintf(stderr, "Error: Failed to read model count for product %d\n", i);
            // 清理已分配内存
            for (int k = 0; k < i; k++) free(cost[k]);
            free(cost);
            free(number_of_models);
            return -1;
        }

        // 验证模型数量是否合法
        if (number_of_models[i] <= 0) {
            fprintf(stderr, "Error: Invalid model count (%d) for product %d\n", number_of_models[i], i);
            for (int k = 0; k < i; k++) free(cost[k]);
            free(cost);
            free(number_of_models);
            return -1;
        }

        cost[i] = malloc(number_of_models[i] * sizeof(int));
        if (cost[i] == NULL){
            fprintf(stderr, "Error: Failed to allocate memory for cost[%d]\n", i);
            for (int k = 0; k < i; k++) free(cost[k]);
            free(cost);
            free(number_of_models);
            return -1;
        }

        // 读取每个模型的成本
        for (j = 0; j < number_of_models[i]; j++){
            if (scanf("%d", &cost[i][j]) != 1) {
                fprintf(stderr, "Error: Failed to read cost for product %d model %d\n", i, j);
                // 清理已分配内存
                free(cost[i]);
                for (int k = 0; k < i; k++) free(cost[k]);
                free(cost);
                free(number_of_models);
                return -1;
            }
        }
    }

    // 这里可以添加你的业务逻辑

    // 程序结束前释放所有内存
    for (i = 0; i < number_of_products; i++) {
        free(cost[i]);
    }
    free(cost);
    free(number_of_models);

    return 0;
}

最后别忘了检查你的输入数据格式是否正确:第一行是两个整数(预算和产品数),之后每一行先输入一个整数(当前产品的模型数),接着输入对应数量的整数(每个模型的成本)。比如要读取cost[0][1],第一行产品数至少是1,然后第一个产品的模型数至少是2,并且后面跟着2个成本数值。

内容的提问来源于stack exchange,提问作者Φαίδων Σεϊτανίδης

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 03:27:30