变量改变的位置?
location of variable changing?
我有一些代码,但出于某种原因,变量的位置在我的代码中间发生了变化。
在我的 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;
}
}
}
City c = {
.value = 1,
.options = nularr,
};
cities[n] = &c;
}
此时 }
,c
超出范围并停止存在(它是该块中的局部变量)。
您刚刚保存的指针 (cities[n]
) 已变得不确定。
基本上,cities 现在是一个无效指针数组。
(另外应该初始化为
City **cities = malloc(numcities * sizeof (City *));
具体来说,sizeof (City *)
,而不是 sizeof (City)
。)
当您分配给 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
的 return 值是否有错误。
我有一些代码,但出于某种原因,变量的位置在我的代码中间发生了变化。 在我的 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;
}
}
}
City c = {
.value = 1,
.options = nularr,
};
cities[n] = &c;
}
此时 }
,c
超出范围并停止存在(它是该块中的局部变量)。
您刚刚保存的指针 (cities[n]
) 已变得不确定。
基本上,cities 现在是一个无效指针数组。
(另外应该初始化为
City **cities = malloc(numcities * sizeof (City *));
具体来说,sizeof (City *)
,而不是 sizeof (City)
。)
当您分配给 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
的 return 值是否有错误。