c - 变量改变的位置?

标签 c segmentation-fault c99

我有一些代码,但出于某种原因,变量的位置在我的代码中间发生了变化。 在我的 main 中,我从 stdin 读取一个整数,然后 malloc 一个结构数组。

int main(){
    int numcities;
    scanf("%d", &numcities);

    City **cities = malloc(numcities*sizeof(City)*2); //*2 is just to be sure, gonna remove that later.

    for(int n = 0;n<numcities;n++){
        int nularr[numcities];
        for(int n2 = 0;n2<numcities;n2++){
            nularr[n2] = 0;
        }
        City c = {
            .value = 1,
            .options = nularr,
        };
        cities[n] = &c;
    };

    readRoads(cities, numcities);
}

readRoads 如下所示。在调用 readRoads 之前,我可以访问 numcities(gdb 和代码内部),但是在尝试使用它时,在它之后 sigsegvs,并且在 gdb 中提示无法读取 0xffffffcd 处的内存。 如果我拿一个指向 numcities 的指针并稍后取消引用它,一切都完好无损。但是在调用 readRoads 之后获取指针会给我 0xffffffcd(始终),这是不可读的。 我已经根据需要从 malloc 获得了两倍的内存,

void readRoads(City **cities, int N){
    for(int n = 0;n<N;n++){
        int buf;
        int res[N];
        int roads = 0;
        City *options[N];
        scanf("%d", &buf);
        for(int r = 0;r<N;r++){
            res[r]= buf << r;
            if(res[r]){
                options[roads] = cities[r];
                roads++;
            }
        }

        cities[n]->id = n;
        cities[n]->name = n +'A';
        cities[n]->optionsCount = 1;

        for(int i = 0; i < roads; i++){
            cities[n]->options[i] = options[i]->id;
        }
    }
}

最佳答案

当您分配给 cities 数组时:

for(int n = 0;n<numcities;n++){
    int nularr[numcities];
    for(int n2 = 0;n2<numcities;n2++){
        nularr[n2] = 0;
    }
    City c = {
        .value = 1,
        .options = nularr,
    };
    cities[n] = &c;
};

您正在分配局部变量的地址。此变量在 for 循环结束时超出范围,因此您最终指向无效内存。取消引用此无效指针会调用 undefined behaivor .当您将 nularr 分配给这些实例之一时,也会发生同样的事情

与其创建一个指向City 的指针数组,不如创建一个City 数组。此外,您还需要动态分配 nularr

City *cities = malloc(numcities*sizeof(City));

for(int n = 0;n<numcities;n++){
    int *nularr = calloc(numcities, sizeof(int);
    cities[n].value = 1;
    cities[n].options = nularr;
};

同时相应地更改 readRoads:

void readRoads(City *cities, int N){
    ...

并且一定要检查 malloc/calloc 的返回值是否有错误。

关于c - 变量改变的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53232834/

相关文章:

c - 以下代码遇到段错误

c - `va_num` 在这个可变参数宏中意味着什么?

C预处理器标记化不扩展宏?

c - 结构的内存大小不同?

c - 如何处理将 usize 传递给需要 uint32_t 的 C 函数?

C - 将指针作为指向另一个函数的指针传递

c - 链表使用中的段错误C

c - 初始化结构段错误

c - 在 C、Linux 中转储调试步骤

在指定的初始值设定项中复制数组