我写了这段代码:
Resident_x * infos_shorted;
Residents=6;
infos_shorted=(Resident_x *)malloc(Residents*(sizeof(Resident_x)));
i=0;
while ((infos_shorted+i)!=NULL){
printf ("%d\n", i);
i++;
}
虽然有人会期望我已经分配了6个内存位置,但是当我运行它时它会一直打印,直到我手动终止它。
我所做的就是找到我的主要问题的答案:
我写道:
Resident_x * infos_shorted;
Residents=6;
infos_shorted[i].height[8]=7;
infos_shorted=(Resident_x *)malloc(Residents*(sizeof(Resident_x)));
for (i=0; i<=Residents+4; i++){
printf ("%d %d\n", infos_shorted[i].height, i);
}
我正确地打印了infos_shorted [i] .height [8]。那是怎么回事;
答案 0 :(得分:1)
while ((infos_shorted+i)!=NULL){
只要i > Residents
,您就有了未定义的行为。然而,infos_shorted + i
很可能会评估i*sizeof(Resident_x)
后面的地址infos_shorted
字节。没有理由期望这样的地址是一个空指针(直到它包装,但这是更多未定义的行为)。
答案 1 :(得分:0)
您希望C运行时能够按照您希望的方式运行;遗憾的是,它并没有那样做。 malloc为你分配了一大块内存,你可以知道它的起点和终点在哪里
你必须做
const int NRES = 6;
Resident_x * infos_shorted;
Residents=NRES;
infos_shorted=(Resident_x *)malloc(Residents*(sizeof(Resident_x)));
i=0;
for(int i = 0; i < NRES; i++){
...info_shorted[i];
}