为什么我的程序会打印一个额外的元素,看起来像一个内存位置?
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。
这样的终止字符答案 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++)