同一内存位置

时间:2016-02-22 14:55:23

标签: c arrays memory struct

我正在开发一个嵌入式C项目。我无法理解代码中数组和结构的使用。

例如:

结构:

struct example_struct{
 char a;
 char b;
 char array[4];

}  

注意:Int和char的默认大小是1个字节。

我正在使用的编译器使用'@'符号

为变量和其他参数提供内存分配功能

例如:

内存分配

int example @ 0x125
// Compiler allocate the RAM memory location 0x125 to my variable "example"  

问题:

编写此项目的人使用了下面给出的结构和数组

example.h文件

struct example_struct{
char a;
char b;
char array[4];
}  

Memory.h

volatile struct example_struct node @ 0x130 ;
//allocate memory location 0x130 - 0x135 to node  
volatile char buffer[6] @ 0x130;
//allocate memory location 0x130 - 0x135 to buffer 

问题

1.使用指针访问结构成员而不是使用放在同一内存位置的数组是否合适?

  1. 是否会导致内存问题?
  2. 请您帮助我理解在这种特殊情况下使用stuct和数组。

    谢谢

    注:Kunal

4 个答案:

答案 0 :(得分:2)

开发该代码的(奇怪的)编码器“模拟”union,以便能够struct example_structbytebyte访问相同的位置。< / p>

像:

#pragma pack(1)
union struct_and_raw_byte_access
{
   struct example_struct
   {
      char a;
      char b;
      char array[4];
   }structured;
   char buffer[sizeof(struct example_struct)];
};
#pragma pack()

int main(void)
{
    union struct_ad_raw_byte_access temp;
    int i;

    temp.structured.a = 1;
    temp.structured.b = 2;
    temp.structured.array[0] = 3;
    temp.structured.array[1] = 4;
    temp.structured.array[2] = 5;
    temp.structured.array[3] = 6;

    for (i=0; i< sizeof(temp.buffer)/sizeof(temp.buffer[0]); i++)
        printf("buffer[%d] = %d\n", i, temp.buffer[i]);

    return 0;
}

答案 1 :(得分:2)

  

1.使用指针访问结构成员而不是使用放在同一内存位置的数组是否合适?

     

2.是否会导致内存问题?

恕我直言,你不能这样做。它可能适用于某些archs,但请记住,您信任编译器将所有内容打包并对齐。

有些编译器有打包指令(pragma或parameteres),但使用union更安全。

答案 2 :(得分:1)

确保缓冲区也是指针,因此分配&#34;缓冲区&#34;绝对地址与指向该地址的指针相同。

volatile char buffer[6] @ 0x130;
//allocate memory location 0x130 - 0x135 to buffer 

在你的情况下,开发人员;我认为;他决定使用数组访问strcutre元素,以便在循环中使用它们。 所以,回答你的问题:

  1. 不,如你所说,不适合制作指针并通过将其转换为(char *)来访问此指针
  2. 如果您知道如何使用&#34; buffer&#34;,则不会发生内存问题。我的意思是确保不会出现索引。

答案 3 :(得分:1)

您的评论&#34; 如果我声明任何全局变量并使用调试器观察它我可以看到值的变化。即使我没有在任何地方使用它们&#34;可能意味着您正在查看某个IO控制器的硬件寄存器。

volatile char buffer[6] @ 0x130;

旨在将这些IO控制器地址映射到嵌入式编程中的变量名称。那就是IO控制器在内存地址0x130到0x135上显示状态和数据 - 并且C程序通过声明将其映射到符号值。

由于此区域的格式由IO控制器确定(您在C代码中无法做任何事情将改变格式),您需要确保strct和example_struct正好是6个字节长,或者如果没有,你会有一些会杀死你的填充物。

使用您的调试器测试它(如果是gdb使用可以使用sizeof,但您的调试器可能不同)

另外,我建议你找一些关于硬件地址0x130

的文档