为什么我从 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 的另一个调用约定。所有可以解释差异的因素。
主要问题是您使用的是未初始化的内存,这几乎可以导致任何问题。
#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 的另一个调用约定。所有可以解释差异的因素。
主要问题是您使用的是未初始化的内存,这几乎可以导致任何问题。