0

我写了这段代码:

        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 个内存位置,但当我运行它时,它会一直打印 i 直到我手动终止它。

这就是我为找到我的主要问题的答案所做的工作:

我写的 :

    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] 。那个怎么样;

4

2 回答 2

1
while ((infos_shorted+i)!=NULL){

只要i > Residents,你有未定义的行为。然而,infos_shorted + i很可能会评估为.i*sizeof(Resident_x)值后面的地址字节infos_shorted。没有理由期望这样的地址是空指针(直到它换行,但这是更多未定义的行为)。

于 2013-04-22T19:40:12.983 回答
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];
       }
于 2013-04-22T20:48:00.890 回答