打印malloc()声明的数组 - 打印出界限的非常短的代码?

时间:2014-08-09 05:56:10

标签: c arrays malloc printf bounds

为什么我的程序会打印一个额外的元素,看起来像一个内存位置?

CODE:

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int i;
    int *n=(int *)malloc(sizeof(int));
    n[0]=1;
    n[1]=2;
    n[2]=3;
    for(i=0;n[i];i++)
        printf("\n%d\n",n[i]);
}

输出:

1

2

3

135153

即使我更换(在主要街区的第2行)

int *n=(int *)malloc(sizeof(int));

int *n=(int *)malloc(sizeof(int)*3);

输出是一样的。我在这里错过了什么?

编辑:好的,所以从我能够理解的情况来看,当你通过一个字符串而不仅仅是任何数组运行时,你只能有这样的条件,因为使用malloc分配的数组( )没有像\ 0。

这样的终止字符

3 个答案:

答案 0 :(得分:3)

您显然需要分配sizeof(int)*3,否则您将覆盖其他一些内存。在这里,这没有任何效果,因为您的简单应用程序在堆上没有任何其他内容。

另一个问题是for循环中的结束条件。 n[i]意味着在数组中偶然出现0。您的数组不是以0结尾,因此它会打印垃圾。请改用for (i=0;i<3;i++)

答案 1 :(得分:1)

您的两个版本的代码都显示undefined behaviour,因此输出可能相同或不同,或者可能会崩溃或其他内容。

如果您尝试访问超出成功分配的内存,您可能会得到任何奇怪的输出。

int *n=(int *)malloc(sizeof(int));
if(n != NULL)
{
  n[0]=1;
  n[1]=2;  /* UB 1 */
  n[2]=3;  /* UB 2 */
  for(i=0;n[i];i++) /* UB 3 */
    printf("\n%d\n",n[i]); /* UB 4 */
}

根据您建议的更改,只有UB1和UB2是固定的。 UB3和UB4保持未定义。

答案 2 :(得分:0)

它与你的for循环有关: 将其替换为:for(i=0;i < 3;i++)