我是一家公司的新手,该公司完成了以下结构的使用:
#include <stdio.h>
#include <string.h>
typedef unsigned char uint8;
typedef signed char int8;
typedef unsigned short int uint16;
typedef signed short int int16;
typedef struct padded_t {
int8 array0[11];
int8 array1[4];
uint16 len2;
int8 array2[25];
uint16 len3;
int8 array3[6];
// many more len/arrays follow
} padded_t;
int main(int argc, char** argv)
{
padded_t foo;
memset((void*)&foo, 0, sizeof(padded_t));
int8* str = "foobar";
int16 size = (int16)strlen(str);
int8* ptr = (int8*)&foo.len2;
// please note that the memcpy references only the pointer to len
// are the following couple of lines safe?
memcpy ((void*)ptr, &size, 2);
memcpy ((void*)&ptr[2], (void*)str, size);
printf("%d\n", foo.len2);
printf("%s\n", foo.array2);
return 0;
}
我知道一些关于对齐和填充的事情,我假设编译器(用于 ARM9 设备的 gnu C99)将添加一些填充以使结构对齐。
但是这段代码安全吗?
据我了解,只要uint16 len
变量紧随其后,int8 array[]
无论其他结构成员如何,它都是安全的。
当它之前的大小是奇数时,它只会在 uint16 之前添加填充吗?
这种用法正确吗?更重要的是,它安全吗?