不能使用 memcpy 来填充 Struct
Cant use memcpy to populate Struct
我正在尝试编写一个程序来模仿一些汇编代码(不要问我为什么,哈哈),它应该看起来像这样。
它应该使用 int 值来填充由 long 值组成的结构的内存。
当我调试程序时,在第一次迭代中 sizeof(int)*a = 0
一切都很好。
但是在第二次迭代中,a=1
和sizeof(int)*1=4
,但是&ss+sizeof(int)*a
不等于&ss+4
而是&ss+0xA0
...然后对于 a = 2
、&ss+0x140
。它不断地乘以 40(十进制)。
十六进制 0xA0
= 4*40
十进制。十六进制 0x140
= 8*40
十进制...
如何进行这项工作?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
long a[5];
} StructType1;
StructType1 foo()
{
StructType1 ss;
int bb = 7;
int a = 0;
while (a < 10)
{
memcpy(&ss + sizeof(int) * a, &bb, 4);
a++;
}
return ss;
}
int main()
{
StructType1 s = foo();
printf("%ld\n", s.a[0]);
}
正如 user3386109 评论的那样,&ss
的类型是 指向 StructType1
对象的指针 ,因此向其添加一个整数 n
计算此类对象数组中第 n
个下一个对象的地址,将 n
乘以对象的大小以获得字节地址。
为了您的目的,您应该将 &ss
转换为指向字符类型的指针。
这是修改后的版本:
#include <stdio.h>
#include <string.h>
typedef struct {
long a[5];
} StructType1;
StructType1 foo(void) {
StructType1 ss;
int bb = 7;
int a = 0;
int n = sizeof ss / sizeof(int);
while (a < n) {
memcpy((char *)&ss + sizeof(int) * a, &bb, sizeof(int));
a++;
}
return ss;
}
int main() {
StructType1 s = foo();
for (int i = 0; i < 5; i++) {
printf("%ld%c", s.a[i], " \n"[i]);
}
return 0;
}
我正在尝试编写一个程序来模仿一些汇编代码(不要问我为什么,哈哈),它应该看起来像这样。
它应该使用 int 值来填充由 long 值组成的结构的内存。
当我调试程序时,在第一次迭代中 sizeof(int)*a = 0
一切都很好。
但是在第二次迭代中,a=1
和sizeof(int)*1=4
,但是&ss+sizeof(int)*a
不等于&ss+4
而是&ss+0xA0
...然后对于 a = 2
、&ss+0x140
。它不断地乘以 40(十进制)。
十六进制 0xA0
= 4*40
十进制。十六进制 0x140
= 8*40
十进制...
如何进行这项工作?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
long a[5];
} StructType1;
StructType1 foo()
{
StructType1 ss;
int bb = 7;
int a = 0;
while (a < 10)
{
memcpy(&ss + sizeof(int) * a, &bb, 4);
a++;
}
return ss;
}
int main()
{
StructType1 s = foo();
printf("%ld\n", s.a[0]);
}
正如 user3386109 评论的那样,&ss
的类型是 指向 StructType1
对象的指针 ,因此向其添加一个整数 n
计算此类对象数组中第 n
个下一个对象的地址,将 n
乘以对象的大小以获得字节地址。
为了您的目的,您应该将 &ss
转换为指向字符类型的指针。
这是修改后的版本:
#include <stdio.h>
#include <string.h>
typedef struct {
long a[5];
} StructType1;
StructType1 foo(void) {
StructType1 ss;
int bb = 7;
int a = 0;
int n = sizeof ss / sizeof(int);
while (a < n) {
memcpy((char *)&ss + sizeof(int) * a, &bb, sizeof(int));
a++;
}
return ss;
}
int main() {
StructType1 s = foo();
for (int i = 0; i < 5; i++) {
printf("%ld%c", s.a[i], " \n"[i]);
}
return 0;
}