#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 會回傳這個答案
uj5u.com熱心網友回復:
您在 中為陣列分配記憶體,A()然后對其進行初始化。通常區域變數是在堆疊上分配的。
從函式回傳后A(),堆疊被清理。然后B()呼叫并將回傳地址壓入堆疊。B()可能會推送 rbp 以更正堆疊幀,然后在堆疊上為恰好與A(). 由于沒有人費心初始化記憶體,它仍將包含與以前相同的值。但這應該被認為是巧合。
不同的編譯器將使用不同的方式來管理記憶體。此外,Windows 使用不同于 Linux 的另一種呼叫約定。所有可以解釋差異的因素。
主要問題是您使用的是未初始化的記憶體,這幾乎可以導致任何事情。
uj5u.com熱心網友回復:
對于兩個函式中的初學者,在i陣列宣告之后宣告的變數
int array[10];
int i;
未使用。
該代碼具有未定義的行為,因為您試圖在函式 B 中輸出未初始化的本地陣列。
盡管它們的回傳型別不是,但這些函式也沒有回傳任何內容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 );
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/410335.html
標籤:
上一篇:fscanf列印未知值
