Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指针传递过程中的内容错误_C_Arrays_Pointers_Scope_Lifetime - Fatal编程技术网

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,