使用指针将数据从一个结构传递到另一个结构的问题
Problem with passing data from one structore to another using pointers
我有数据寻址问题
我正在尝试使用指针一次性将所有数据从一个结构传递到另一个结构
当我这样做时:
#define ADDRESS_SPACE 8
struct dma_engine
{
int (*Address)[ADDRESS_SPACE] = {nullptr};
};
struct data_engine
{
int data[ADDRESS_SPACE] = {0x10,0x14,0x18,0x1B,0x20,0x24,0x28,0x2B};
};
int main(int argc, char* argv[])
{
dma_engine Dma_0;
data_engine Data_0;
Dma_0.Address = &Data_0.data;
for(int i = 0;i <ADDRESS_SPACE;i++)
{
printf("*Dma_0.Address[%d] ---> 0x%x\n",i,*Dma_0.Address[i]);
}
printf("\n");
return 0;
}
我只收到数据的第一个正确元素[ADDRESS_SPACE]数组:
*Dma_0.Address[0] ---> 0x10
*Dma_0.Address[1] ---> 0x96408360
*Dma_0.Address[2] ---> 0x77a39b80
*Dma_0.Address[3] ---> 0xb6072bc0
*Dma_0.Address[4] ---> 0x0
*Dma_0.Address[5] ---> 0x0
*Dma_0.Address[6] ---> 0x96408368
*Dma_0.Address[7] ---> 0x0
有没有办法一次性传递所有正确的数据,而不是单独处理数组的每个元素?
非常感谢
假设您确实希望 strongly-typed pointer-to-array 作为您的 Address
成员,您的代码在打印循环期间没有正确取消引用目标数组。具体来说,这个:
*Dma_0.Address[i]
该成员是指向 array-of-8-int 的指针。该语法在同一表达式中对同一操作数应用 both *
和 [i]
,这不是您想要的。 []
比 C 语言中的 *
higher precedence 应用在这种情况下。
因此您可能认为表达式的意思是:
- 使用
*
取消引用 pointer-to-array 以获取基本数组
- 对该数组应用
[i]
以获得所需的第 i
个元素。
但实际上你问的是:
- 找到第
i
个 array-of-8-int,从指定地址开始。
- 使用
*
获取该数组的第一个元素
解决方案
假设您想保留所有现有的类型用法,解决方案是通过将 *
first 封装在具有更高优先级的东西中来简单地强制求值比 []
。表达式括号在该语言中具有最高优先级,将提供您想要的内容。
因此,
(*Dma_0.Address)[i]
表示:在将 [i]
应用到结果之前评估 *Dma_0.Address
。您程序中的这一更改会产生以下输出*:
*Dma_0.Address[0] ---> 0x10
*Dma_0.Address[1] ---> 0x14
*Dma_0.Address[2] ---> 0x18
*Dma_0.Address[3] ---> 0x1b
*Dma_0.Address[4] ---> 0x20
*Dma_0.Address[5] ---> 0x24
*Dma_0.Address[6] ---> 0x28
*Dma_0.Address[7] ---> 0x2b
我怀疑你真正想要的是什么。
* 我没有费心去更改任何 printf 消息,只选择更改有问题的参数,当我测试它时,以防那不是很明显
我有数据寻址问题
我正在尝试使用指针一次性将所有数据从一个结构传递到另一个结构
当我这样做时:
#define ADDRESS_SPACE 8
struct dma_engine
{
int (*Address)[ADDRESS_SPACE] = {nullptr};
};
struct data_engine
{
int data[ADDRESS_SPACE] = {0x10,0x14,0x18,0x1B,0x20,0x24,0x28,0x2B};
};
int main(int argc, char* argv[])
{
dma_engine Dma_0;
data_engine Data_0;
Dma_0.Address = &Data_0.data;
for(int i = 0;i <ADDRESS_SPACE;i++)
{
printf("*Dma_0.Address[%d] ---> 0x%x\n",i,*Dma_0.Address[i]);
}
printf("\n");
return 0;
}
我只收到数据的第一个正确元素[ADDRESS_SPACE]数组:
*Dma_0.Address[0] ---> 0x10
*Dma_0.Address[1] ---> 0x96408360
*Dma_0.Address[2] ---> 0x77a39b80
*Dma_0.Address[3] ---> 0xb6072bc0
*Dma_0.Address[4] ---> 0x0
*Dma_0.Address[5] ---> 0x0
*Dma_0.Address[6] ---> 0x96408368
*Dma_0.Address[7] ---> 0x0
有没有办法一次性传递所有正确的数据,而不是单独处理数组的每个元素?
非常感谢
假设您确实希望 strongly-typed pointer-to-array 作为您的 Address
成员,您的代码在打印循环期间没有正确取消引用目标数组。具体来说,这个:
*Dma_0.Address[i]
该成员是指向 array-of-8-int 的指针。该语法在同一表达式中对同一操作数应用 both *
和 [i]
,这不是您想要的。 []
比 C 语言中的 *
higher precedence 应用在这种情况下。
因此您可能认为表达式的意思是:
- 使用
*
取消引用 pointer-to-array 以获取基本数组 - 对该数组应用
[i]
以获得所需的第i
个元素。
但实际上你问的是:
- 找到第
i
个 array-of-8-int,从指定地址开始。 - 使用
*
获取该数组的第一个元素
解决方案
假设您想保留所有现有的类型用法,解决方案是通过将 *
first 封装在具有更高优先级的东西中来简单地强制求值比 []
。表达式括号在该语言中具有最高优先级,将提供您想要的内容。
因此,
(*Dma_0.Address)[i]
表示:在将 [i]
应用到结果之前评估 *Dma_0.Address
。您程序中的这一更改会产生以下输出*:
*Dma_0.Address[0] ---> 0x10
*Dma_0.Address[1] ---> 0x14
*Dma_0.Address[2] ---> 0x18
*Dma_0.Address[3] ---> 0x1b
*Dma_0.Address[4] ---> 0x20
*Dma_0.Address[5] ---> 0x24
*Dma_0.Address[6] ---> 0x28
*Dma_0.Address[7] ---> 0x2b
我怀疑你真正想要的是什么。
* 我没有费心去更改任何 printf 消息,只选择更改有问题的参数,当我测试它时,以防那不是很明显