C 指针传递过程中的内容错误
在下面的项目中,初始化C 指针传递过程中的内容错误,c,arrays,pointers,scope,lifetime,C,Arrays,Pointers,Scope,Lifetime,在下面的项目中,初始化test.c所需的参数安排在结构DataStructure中(这里我只有一个指针U8*缓冲区)。在init期间,指针缓冲区被初始化(指向数组),函数test\u init将initData传递到test.c。在test.c中打印数组的内容 main.c 及 这是错误的。但是如果我也在init函数中打印SL.Buffer的元素,即如果我将init函数更改如下: void init(DataStructure *pSL) { U8 Buffer[8] = {0xF1 ,
test.c
所需的参数安排在结构DataStructure
中(这里我只有一个指针U8*缓冲区
)。在init
期间,指针缓冲区
被初始化(指向数组),函数test\u init
将initData
传递到test.c
。在test.c
中打印数组的内容main.c 及 这是错误的。但是如果我也在
init
函数中打印SL.Buffer
的元素,即如果我将init
函数更改如下:
void init(DataStructure *pSL)
{
U8 Buffer[8] = {0xF1 , 0xF2 , 0xF3 , 0xF4 , 0xF5 , 0xF6 , 0xF7 , 0xF8};
DataStructure SL;
U8* pC = &Buffer[0];
SL.Buffer = pC;
*pSL = SL;
printf("\n main: ");
for(int i=0;i<8;i++)
printf("0x%0x, ",*(SL.Buffer+i));
}
谁能解释一下这段代码有什么问题,为什么只需在init
函数中打印数组就可以解决这个问题初始化和传递包含指针的结构是否正确?
代码是我的项目的一个简单版本。最初,
DataStructure
包含更多的参数,参数COUNT
(initData的大小不止一个。问题在于使用缓冲区
数组
它是init()
函数的本地元素,但是您返回要在函数外部使用的数组的第一个元素的地址,其中数组不再存在。因此,该地址本质上是无效的,任何访问该内存的尝试都会导致错误
在第二种情况下,它工作正常,因为您在数组停止生存期之前打印它,所以您得到了预期的结果
解决方案:您需要将
静态
存储分配给缓冲区
数组,或者使用内存分配器函数,以便内存的生命周期取代函数作用域。问题在于使用缓冲区
数组
它是init()
函数的本地元素,但是您返回要在函数外部使用的数组的第一个元素的地址,其中数组不再存在。因此,该地址本质上是无效的,任何访问该内存的尝试都会导致错误
在第二种情况下,它工作正常,因为您在数组停止生存期之前打印它,所以您得到了预期的结果
解决方案:您需要将
静态
存储分配给缓冲区
数组,或者使用内存分配器函数,以便内存的生命周期取代函数范围。似乎是分配临时变量(缓冲区)地址的经典案例指向指针,而不是在临时变量超出范围后使用该指针(当init()函数退出时)?正确,如果我在init
外部定义数组,它会工作,但是为什么我在init
中打印数组时得到了正确的结果?您调用的是未定义的行为,这基本上意味着任何事情都可能发生。包括看似正确的结果,因为从init()重新运行后堆栈还没有被破坏将临时变量(缓冲区)的地址分配给指针,而不是在临时变量超出范围后(当init()函数退出时)使用该指针,这似乎是一个经典的例子?正确,如果我在init
外部定义数组,它会工作,但是为什么我在init
中打印数组时得到了正确的结果?您调用的是未定义的行为,这基本上意味着任何事情都可能发生。包括看似正确的结果,因为从init()重新运行后堆栈还没有被破坏解决方案是正确的,但我不满意您的理由:为什么在第一种情况下,数组的最后一部分打印正确?如果是本地的,则应隐藏整个部分。此外,在第二种情况下,第二次打印(在test\u init
中)是在该数组的生存期结束后进行的Buffer@Behy1)2)解决方案是正确的,但我不满意你的理由:为什么在第一种情况下数组的最后一部分打印正确?如果是局部的,则应隐藏整个零件。此外,在第二种情况下,第二次打印(在test_init
中)是在完成该打印的生命周期之后Buffer@Behy 1) 2)
#ifndef TEST_H_
#define TEST_H_
#ifndef U8
typedef unsigned char U8;
#endif
typedef struct{
U8 *Buffer;
} DataStructure;
#define COUNT 1
void test_init (DataStructure *List);
void test_run ();
#endif /* TEST_H_ */
#include <stdio.h>
#include <stdlib.h>
#include "test.h"
static DataStructure *pD;
void test_init (DataStructure *_pD)
{
pD = _pD;
printf("\n test_init: ");
for(int i=0;i<8;i++)
printf("0x%0x, ",*(pD->Buffer+i));
}
void test_run (void)
{
printf("\n test_run: ");
for(int i=0;i<8;i++)
printf("0x%0x, ",*(pD->Buffer+i));
}
test_init: 0x0, 0x0, 0x0, 0x0, 0xf5, 0xf6, 0xf7, 0xf8,
test_run: 0x0, 0x0, 0x0, 0x0, 0xf5, 0xf6, 0xf7, 0xf8,
void init(DataStructure *pSL)
{
U8 Buffer[8] = {0xF1 , 0xF2 , 0xF3 , 0xF4 , 0xF5 , 0xF6 , 0xF7 , 0xF8};
DataStructure SL;
U8* pC = &Buffer[0];
SL.Buffer = pC;
*pSL = SL;
printf("\n main: ");
for(int i=0;i<8;i++)
printf("0x%0x, ",*(SL.Buffer+i));
}
main: 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
test_init: 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
test_run: 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,