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

C语言DVR模拟程序嵌套For循环触发Segmentation Fault求助

解决DVR模拟程序中的Segmentation Fault问题

我正在使用C语言开发一款DVR模拟程序,计划通过嵌套for循环实现,但输入系统中的路由器数量后,程序运行会触发Segmentation Fault。编译器未输出任何错误或警告,附上未完成的程序代码,恳请各位提供帮助解决该问题:

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

typedef struct{
    int targetRouter[1024];
    int nextRouter[1024];
    int cost[1024];
}routers;

routers *routerSet[1024];


int main(){
    int numberOfRouters;
    char buffer[1024];
    
    printf("How many routers are in this network?\n");
    fgets(buffer, 1024, stdin);
    numberOfRouters = atoi(buffer);
    
    for(int i = 0; i < numberOfRouters; i++){
        for(int k=0; k<numberOfRouters; k++){
            if(i == k){
                routerSet[i]->targetRouter[k] = i;
                routerSet[i]->nextRouter[k] = i;
                routerSet[i]->cost[k] = 0;
            }
            else{ //different router
                printf("Is router number %d directly connected to router number %d (y/n)?\n", i, k);
                scanf("%s", buffer);
                
                if(strncmp(buffer, "y", 1) == 0){
                    bzero(buffer, sizeof(buffer));
                    routerSet[i]->targetRouter[k] = k;
                    routerSet[i]->nextRouter[k] = k;
                    printf("What is the delay between router number %d and router number %d?\n", i, k);
                    fgets(buffer, 1024, stdin);
                    routerSet[i]->cost[k] = atoi(buffer);
                }
                else if(strncmp(buffer, "n", 1) == 0){
                    routerSet[i]->targetRouter[k] = k;
                    routerSet[i]->nextRouter[k]=-1;
                    routerSet[i]->cost[k] = -1;
                }
                else{
                    printf("Invalid input. Ending program.\n");
                    exit(0);
                }
                bzero(buffer, sizeof(buffer));
            }
        }
    }
    
    for(int i = 0; i < numberOfRouters; i++){
        printf("Router table for router number %d\n", i);
        for(int k=0; k < numberOfRouters; k++){
            printf("%d | %d | %d\n", routerSet[i]->targetRouter[k], routerSet[i]->nextRouter[k], routerSet[i]->cost[k]);
        }
    }
}

注:该程序尚未完成,需先解决此错误才能继续开发。


错误原因及修复方案

1. 野指针访问导致Segmentation Fault

routerSet是routers*类型数组,但程序未给数组内的每个指针分配实际内存空间。直接通过routerSet[i]->xxx访问结构体成员时,指针指向未初始化的野内存,触发段错误。

修复:
在第一个for循环开头,为每个routerSet[i]分配内存:

for(int i = 0; i < numberOfRouters; i++){
    routerSet[i] = malloc(sizeof(routers));
    if(routerSet[i] == NULL){
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }
    // 原有嵌套循环代码...
}

程序结束前释放内存,避免泄漏:

// 打印路由表后添加
for(int i = 0; i < numberOfRouters; i++){
    free(routerSet[i]);
}

2. 混合输入函数导致的缓冲区问题

scanf("%s", buffer)读取输入后,输入流会残留换行符,后续fgets会直接读取空换行,导致atoi解析出0,引发逻辑错误。

修复:
在scanf后清理输入缓冲区:

scanf("%s", buffer);
while(getchar() != '\n'); // 吃掉残留换行符

或统一用fgets读取所有输入再解析,避免输入流混乱。

3. 代码细节修正

  • 原printf中的换行需改为标准\n(已在代码示例中修正);
  • 若编译器不支持bzero,可替换为标准C的memset(buffer, 0, sizeof(buffer))。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:24:54