不能使用 memcpy 来填充 Struct

Cant use memcpy to populate Struct

我正在尝试编写一个程序来模仿一些汇编代码(不要问我为什么,哈哈),它应该看起来像这样。

它应该使用 int 值来填充由 long 值组成的结构的内存。

当我调试程序时,在第一次迭代中 sizeof(int)*a = 0 一切都很好。

但是在第二次迭代中,a=1sizeof(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;
}