我正在try 用C语言创建一个DVR模拟.我知道我需要一个嵌套的for循环,但每当我编译和运行程序时,在输入系统中的路由数量后,它都会产生分段错误.编译器没有生成任何错误或警告.任何帮助都将不胜感激.下面的代码

#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)?", i, k);
                scanf("%s\n", 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?", 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.");
                    exit(0);
                }
                bzero(buffer, sizeof(buffer));
            }
        }
    }
    
    for(int i = 0; i < numberOfRouters; i++){
        printf("Router table for router number %d", 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]);
        }
    }
}

请注意,此程序尚未完成.我只是不能继续在程序的其余部分工作,直到这个错误被修复.

推荐答案

您声明了一个空指针数组

routers *routerSet[1024];

注意:数组中的指针被初始化为空指针,因为数组具有静态存储持续时间.

所以使用这些空指针来访问内存,就像下面这些语句中的那样

routerSet[i]->targetRouter[k] = i;
routerSet[i]->nextRouter[k] = i;
routerSet[i]->cost[k] = 0;

调用未定义的行为.

您需要声明 struct 类型的对象数组,而不是指针

routers routerSet[1024];

或者为数组中的每个指针动态分配一个 struct 类型的对象.

C++相关问答推荐

从内联程序集调用Rust函数和调用约定

使用单个字节内的位字段

在C中使用动态内存分配找到最小的负数

Kdb:仅升级指定的列

从uint8_t*转换为char*可接受

有什么方法可以将字符串与我们 Select 的子字符串分开吗?喜欢:SIN(LOG(10))

如何在C中只对字符串(包含数字、单词等)中的数字进行重复操作?

一旦运行长度超过2,编译器是否会优化";strnlen(mystring,32)>;2";以停止循环?

变量的作用域是否在C中的循环未定义行为或实现定义行为的参数中初始化?

将多项式从文件.txt加载到终端时出现问题

如何将大写/小写土耳其字母相互转换?

我正在try 将QSORT算法实现为C++中的泛型函数

try 判断长整数是否为素数

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

在C中,为什么这个带有递增整数的main函数从不因溢出而崩溃?

如何不断地用C读取文件?

如何使crc32的结果与cksum匹配?

";错误:寄存器的使用无效;当使用-masm=intel;在gcc中,但在AT&;T模式

变量的指针右对齐,函数的指针左对齐

运行以下 C 程序时出现分段错误