c语言中的意外数组分配

c语言中的意外数组分配,c,dynamic-memory-allocation,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++;

我编写了以下代码:

        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);
    }
Resident_x*infos_;
居民=6人;
infos_短路[i]。高度[8]=7;
infos_shorted=(常驻居民×)malloc(常驻居民×(常驻居民×);
对于(i=0;i

只要
i>Resident
,您就有了未定义的行为。然而,
infos\u shorted+i
很可能会计算为
i*sizeof(Resident\u x)
字节后的地址
infos\u shorted
。没有理由期望这样的地址是空指针(直到它包装,但这是更多未定义的行为)。

您希望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];
       }
const int NRES=6;
居民信息;
居民=NRES;
infos_shorted=(常驻居民×)malloc(常驻居民×(常驻居民×);
i=0;
对于(int i=0;i
为什么在分配中预期为NULL?malloc不会自动用NULL终止内存,因此您可能会永远循环。@Eddy-比这更糟糕的是:OP预期在分配之外增加指针会使指针=NULL(而不是内容)如果你也阅读第二个代码示例,你就会理解我的问题。我分配了6个内存位置,但从表面上看,我可以使用我想要的任意多个位置。即使你不去引用它,它真的是未定义的吗?@Roddy是的。仅仅计算它是未定义的行为。标准没有对可能的实现进行太多限制,并且允许这样做d事情会发生。事实上,在x86子代上,这是无害的,唯一真正的危险是溢出/环绕。@Roddy,是的,指针算法只在您停留在有效对象(或后面的一个元素)内时定义。原因可能是内存分段。@Roddy不,
&x[10]
没问题,就是这样标准明确允许并保证工作的“一个元素结束”(计算地址,
&*(x+10)
中的解引用因
&
而不进行评估)。我为什么要这样做?我写的程序没有分配更多的内存。它只是试图使用它没有分配的内存。这种尝试的结果是未定义的行为;它可能会崩溃,或者看起来好像未分配的内存实际上已经分配了,或者其他任意好或坏的事情。解决方案:不要这样做。@Hobowpen-程序分配了你要求的内容(6个驻留);你有时可以在内存中的其他地方闲逛这一事实很有趣,但并不重要。你最终会出现崩溃和其他无法解释的行为。试着用electric fence(可能还有valgrind)运行你的程序他们会为您捕获所有这些错误事实上这取决于您是在编写程序还是试图了解机器、内存、编译器和运行时的动态。如果是前者,请相信我们;如果是后者,那么这个空白太小,无法输入解释,您需要一本教科书或谷歌time@pm100费马参考+1引用;-)
  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];
       }