【发布时间】:2020-12-31 12:17:12
【问题描述】:
我试图从结构的特定内存地址读取单个字节,然后将相同的字节写入相同的地址。我的目标是将与该内存地址关联的 64 字节内存加载到缓存行中。
我有一个大小为12584 的结构变量testStructure。我尝试使用以下代码将 1 个字节读回内存地址,
unsigned char *p;
int forEachCacheLine = sizeof(testStructure);
printf("size of forEachCacheLine is %d\n", forEachCacheLine);
for (int i = 0; i<forEachCacheLine ; i+=64) {
printf("i is %d\n",i);
// read 1 byte
p=(unsigned char *)&testStructure+i;
printf("Read from %p byte is %hhx\n", &testStructure+i, p);
// write 1 byte
*(unsigned char *)(&testStructure+i)=p;
printf("Write into %p byte is %hhx\n\n", &testStructure+i, p);
}
运行代码后,我得到以下输出:
size of forEachCacheLine is 12584
i is 0
Read from 0x7f5d42e71f80 byte is 80
Write into 0x7f5d42e71f80 byte is 80
i is 64
Read from 0x7f5d42f36980 byte is c0
Segmentation fault (core dumped)
如输出所示,第一次迭代中的写入尝试成功。但是,第二次迭代会导致Segfault。关于我为什么会收到这个Segmentation fault 的任何信息?
我不太确定这是否是实现我的目标的正确方法。但到目前为止,这是我能想到的唯一方法。如果这是一种不正确的方法,有人可以建议另一种方法吗?
【问题讨论】:
-
p=(unsigned char *)&testStructure+i;之后,p和&testStructure+i一样,所以可以printf("Read from %p byte is %hhx\n", p, p);。 -
即使不需要,我也会在指针分配中添加额外的括号。例如,使用
p = (&testStructure) + i;。 -
小心指针运算。
(&testStructure+i)不会在地址中添加i,而是i * sizeof testStructure -
在写赋值
*(unsigned char *)(&testStructure+i)=p;:p不是字节,是指向字节的指针。如果你想写这个指针指向的值,你应该做(&testStructure) + i = *p;。但是,如果这可行,它应该写入相同的字节,因为p指向与(&testStructure) + i相同的内存地址,因为之前的分配。