c中无法满足的数组分配

时间:2013-04-22 19:36:20

标签: c dynamic-memory-allocation

我写了这段代码:

        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]。那是怎么回事;

2 个答案:

答案 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];
       }