这个问题在这里已有答案:
我在局部变量的内存分配上面临一个问题。这是数据数组(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数组的值。任何人都可以解释这种行为。
您的代码存储指向Data1
中声明的本地数组Data2
和Func1
的指针。它将这些指针存储在PutData1[0]
和PutData2[0]
中。当Func1
完成时,这些局部数组Data1
和Data2
被破坏。 PutData1[0]
和PutData2[0]
指针变得晃来晃去。任何通过这些悬空指针访问任何东西的尝试都会导致未定义的行为。
在调用call_func1
制作的Func2
时,你试图通过悬挂的PutData1[0]
和PutData2[0]
指针访问数据。行为未定义。这里的所有都是它的。