C全局变量和局部变量[重复]

问题描述 投票:-4回答:1

我在局部变量的内存分配上面临一个问题。这是数据数组(data1,dat2,data3,data4)声明为本地时代码https://ideone.com/3O9522的链接。

unsigned char *PutData1[2];  
unsigned char *PutData2[2];  
void call_func1(unsigned char x, unsigned char *Test1, unsigned char *Test2)
{  
PutData1[x] = Test1;   
PutData2[x] = Test2;  
if (x== 0)  
{  
printf("Init PutData1: %02x %02x %02x %02x  \n", PutData1[0][0], 
PutData1[0][1], PutData2[0][0], PutData2[0][1]);
}  
if (x== 1)  
{  
printf("PutData2: %02x %02x %02x %02x  \n", PutData1[1][0], PutData1[1]
[1],PutData2[1][0], PutData2[1][1] );  
printf("Afer PutData1: %02x %02x %02x %02x  \n", PutData1[0][0], PutData1[0]
[1], PutData2[0][0], PutData2[0][1]);  
}  
}  

void Func1(void)  
{  
unsigned char Data1[2] = { 0xAB, 0xCD };  
unsigned char Data2[2] = { 0xDE, 0xAE };  
call_func1(0, &Data1[0], &Data2[0]);  
}  

void Func2(void)  
{  
unsigned char Data3[2] = { 0x44, 0x33 };  
unsigned char Data4[2] = { 0x11, 0x55 };  
call_func1(1,&Data3[0], &Data4[0]);  

}  

int main(void) {  
Func1 ();  
Func2 ();  
return 0;  
}  

调用call_func1(1,&Data3 [0],&Data4 [0])后,Data1和Data2数组的值被覆盖

这是代码https://ideone.com/I00OZj的链接

当数据数组声明为全局时。在调用call_func1(1,&Data3 [0],&Data4 [0])之后,保留Data1和Data2数组的值。任何人都可以解释这种行为。

c
1个回答
1
投票

您的代码存储指向Data1中声明的本地数组Data2Func1的指针。它将这些指针存储在PutData1[0]PutData2[0]中。当Func1完成时,这些局部数组Data1Data2被破坏。 PutData1[0]PutData2[0]指针变得晃来晃去。任何通过这些悬空指针访问任何东西的尝试都会导致未定义的行为。

在调用call_func1制作的Func2时,你试图通过悬挂的PutData1[0]PutData2[0]指针访问数据。行为未定义。这里的所有都是它的。

© www.soinside.com 2019 - 2024. All rights reserved.