为什么我从 gcc 中的 C 代码 运行 和 Visual Studio 运行 中得到不同的结果

Why do I get different results from C code running in gcc and Visual Studio running it

#include <stdio.h>

int A()
{
    int array[10];
    int i;
    for (int i = 0; i < 10; i++)
    {
        array[i] = i;
    }
}

int B()
{
    int array[10];
    int i;
    for (int i = 0; i < 10; i++)
    {
        printf("%d", array[i]);
    }
}

int main()
{
    A();
    B();
}

这是我的代码,我认为数组应该在函数B中重新初始化一次,所以我认为Visual Studio的答案是我想要的,但我无法理解为什么 GCC 返回这个答案

对于两个函数的初学者来说,变量 i 在数组声明

之后声明
int array[10];
int i;

未使用。

该代码具有未定义的行为,因为您试图在函数 B 中输出未初始化的本地数组。

函数 return 也没什么,尽管它们的 return 类型不是 void

int B()
{
    int array[10];
    int i;
    for (int i = 0; i < 10; i++)
    {
        printf("%d", array[i]);
    }
}

您需要的是以下内容

#include <stdio.h>

void A( int array[], int n )
{
    for ( int i = 0; i < n; i++)
    {
        array[i] = i;
    }
}

void B( const int array[], int n )
{
    for (int i = 0; i < n; i++)
    {
        printf("%d ", array[i]);
    }
    putchar( '\n' );
}

int main( void )
{
    enum { N = 10 };
    int array[N];

    A( array, N );
    B( array, N );
}

您在 A() 中为数组分配内存,然后对其进行初始化。 通常局部变量分配在栈上。

从函数 A() 调用 return 后,堆栈被清理。 然后调用 B() 并将 return 地址压入堆栈。 B() 可能会压入 rbp 以更正堆栈帧,然后在堆栈上为恰好与 A() 中使用的数组相似的数组分配内存。由于没有人不厌其烦地初始化内存,它仍将包含与以前相同的值。但这应该算是巧合吧。

不同的编译器会使用不同的内存管理方式。此外 Windows 使用不同于 Linux 的另一个调用约定。所有可以解释差异的因素。

主要问题是您使用的是未初始化的内存,这几乎可以导致任何问题。