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
相关产品推荐
相关产品推荐

