C编程-整数值打印错误

C编程-整数值打印错误,c,printf,C,Printf,我使用的是Borland C v3.1 DOS版本 这是我的密码 #include<stdio.h> #include<conio.h> void WTF() { int array[15],i; int WTF_NUMBER=12345; for(i=0;i<16;i++) array[i]=0; printf("%d",WTF_NUMBER); } void main() { clrscr(); WTF()

我使用的是Borland C v3.1 DOS版本

这是我的密码

#include<stdio.h>
#include<conio.h>

void WTF()
{
    int array[15],i;
    int WTF_NUMBER=12345;

    for(i=0;i<16;i++) array[i]=0;

    printf("%d",WTF_NUMBER);
}

void main()
{
    clrscr();
    WTF();
    getch();
}

我应该得到12345作为输出,但我得到的是0。帮助。

您的代码不正确

而不是


fori=0;i在for循环中超出了数组边界。因此,假设i=0;i数组可以容纳15个元素,0-14应该是数组索引


访问数组[15]超出范围。

您的外观大小错误,数组有15个元素,循环循环16次,它覆盖了数组的结尾和计数器。

您将数组定义为只有15个元素

int array[15],i;
但是在定义下面的循环中,您试图初始化16个元素,即索引为0到15(包括0到15)的元素

for(i=0;i<16;i++) array[i]=0;
在这种情况下,数组的所有元素都将由0初始化

用零初始化数组的另一种方法是使用标准函数memset

memset( array, 0, 15 * sizeof( int ) );


由于数组大小无效,程序将崩溃;将其更改为15 in for循环,您将获得所需的输出。

而不是使用for循环 尝试像这样初始化数组

int array[15] = {0};

我想你会得到你想要的结果。

通过明智地使用标准库,你可以解决几个问题。实际上根本不需要在显式循环中执行此操作:


由于for循环中的数组大小错误,WTF Number的值被重写。

i我只是想澄清一下,数组中的元素编号为0-14,当设置数组[15]时,您对自己不拥有的内存做了一些不好的事情。停止浪费精力:memset array,0,sizeof array;你应该做的第一件事是停止使用Borland,并获得一个在过去二十年中一直保持最新的编译器:-更好的是使用sizeofarray而不是15。@codemonkey“错”不是“更好”。它可能是sizeofarray/sizeofarray[0],但太长,无法键入;然而,它是否长并不重要。它更灵活。除非你对崩溃的定义与标准不同,否则不会。UB可能会崩溃,但绝对不能保证。
memset( array, 0, 15 * sizeof( int ) );
memset( array, 0, sizeof( array ) );
int array[15] = {0};
int array[15];
memset (array, 0 , sizeof (array));