Closed. This question needs details or clarity。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
                        
                        4年前关闭。
                                                                                            
                
        
在处理其他问题时,我需要创建一些指向内存中任意选定区域的指针,以便能够查找内存值。实验给我带来了有趣的问题和疑问。

考虑以下代码:

//Some hypothetical memory area simulation
unsigned char data[4][4] =
{
    {0x11,0x11,0x11,0x11}, //Memory areas 0x00 - 0x03
    {0x22,0x22,0x22,0x22}, //Memory areas 0x04 - 0x07
    {0x33,0x33,0x33,0x33},
    {0x44,0x44,0x44,0x44},
};

// Structure that wraps byte array
typedef struct
{
    unsigned char TestArr1[4];
    unsigned char TestArr2[4];
    unsigned char TestArr3[4];
    unsigned char TestArr4[4];
}structure_t;

//Pointer to array of 4 chars
unsigned char (*MemLookup1)[4];

structure_t *StructLook;

int main(void)

{
    //Set both tested variables on first address of test array
    MemLookup1 = &data;
    StructLook = &data;
    //Some helpers to visualize results
    unsigned char * temp1, *temp2, *temp3, *temp4, *temp5;
    temp1 = &MemLookup1[0][0];
    temp2 = &MemLookup1[0][1];
    temp3 = &MemLookup1[0][2];
    temp4 = &MemLookup1[0][3];
    temp5 = &MemLookup1[1][0];

}


MemLookup1被声明为指向4个字符的数组的指针(根据THIS)。调试器下的结果令我惊讶。

临时值如下:

*temp1 = 0x11
*temp2 = 0x22
*temp3 = 0x33
*temp4 = 0x44
*temp5 = 0x11 //在存储区0x04

的价值

StructLook.TestArr10x11,0x11,0x11,0x11

StructLook.TestArr20x22,0x22,0x22,0x22

等等。

问题是:


如何记录和解释指针的“附加”维的此功能?请注意,在指针导航时会使用[n] [x]表示法,即使该指针被声明为单维数组。
为什么以这种方式定义的指针中的内存对齐方式使值在内存中“垂直”呈现?在遍历第一个索引时,即&(MemLookup1[1])给我们的地址是MemLookup1[0] + size of element pointed by pointer,而不是自然而然的,它是array或chars本身的第二个元素。
如何创建满足我的要求的数组类型指针?
最后但并非最不重要的一点:当将数组包装在结构周围时,为什么这样做工作得很好? StructLook完全满足了我的需求,可以线性查询存储单元。


编辑

Pics来自调试器。
代码针对C(MinGW + GDB)进行编译

最佳答案

由于您的代码非常类似于C,并且gcc成功编译了它-尽管带有警告-所以我将回答C情况。

首先,我确认您的MemLookup1被声明为指向四个unsigned char数组的指针。我还观察到,您的data被声明为包含四个unsigned char的四个数组的数组,因此data元素的类型与MemLookup1指向的类型相同。

现在考虑这个任务:

MemLookup1 = &data;


右侧是指向由四个unsigned char组成的四个数组的数组的指针,而左侧则是指向由四个unsigned char组成的数组的指针。这些不是兼容类型,因此您的代码不满足对简单赋值运算符(由C2011在6.5.16.1/1上表示)的操作数的约束,因此程序的行为是不确定的。对StructLook的分配也类似。正确的分配应为MemLookup1 = dataMemLookup1 = &data[0]或类似名称。

尽管C并未定义程序的行为,但如果可以对其进行编译,则我们确实可以使用调试器来尝试查看某个特定运行中实际发生的情况。请注意,C不能保证每次运行都将是同一件事,甚至不能保证程序不会以某种方式与调试器不兼容,而是希望永生。

在这里,你跌倒了。您声称通过指针MemLookup1获得的数据视图与通过指针StructLook获得的数据视图不同,但是调试器窗口的图像中显示的表达式并不相似。例如,您似乎对StructLook->TestArr1[1]*MemLookup1[1]具有不同的值感到惊讶,但这是可以预期的。

正如我们已经建立的,MemLookup1是指向四个unsigned char数组的指针。因此,MemLookup1[1]指定内存中MemLookup1[0]之后的数组。在这种情况下,调试器显示MemLookup1StructLook都是data的别名,因此MemLookup1[1]是指向data[1]的指针,而StructLook->TestArr1data[0]的别名。数组索引比指针解引用具有更高的优先级,在这种情况下,就像在大多数其他情况下一样,数组值表达式会衰减到指向数组第一个元素的指针,因此*MemLookup1[1]等效于data[1][0]。与(*MemLookup1)[1](等同于data[0][1])对比。还要注意(*MemLookup1)[1]的形式和MemLookup1声明的形式的相似性。

这与temp1 ... temp5的关系尚不清楚。您的调试视图不显示任何与此相关的表达式。

关于c - 数组映射选定的内存区域,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34296534/

10-12 01:10