【发布时间】:2014-08-09 05:56:10
【问题描述】:
为什么我的程序会打印一个额外的元素,看起来像一个内存位置?
代码:
#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。
【问题讨论】:
-
因为你很幸运,这是未定义的行为。 for 循环中的条件导致越界。
-
所以当 malloc() 时你不能像这样检查 n[i] 吗?
-
@user3833914 不,你不能,因为你不知道
n[i]值之后的内存是什么。 -
n[i]是一个值,如果值等于 0,则循环条件无效,否则循环停止(即,如果n[i] != 0)循环继续。在您的情况下,您很幸运没有崩溃。 -
@WhozCraig 我也坚信这一点。 “幸运”显然是一个善意的讽刺:)
标签: c arrays malloc printf bounds