我想总结一下我结构的所有字节。我读到我应该将我的结构的指针从char转换为short。为什么?
使用(短)从char到short的转换是否正确?
我的代码
#include <stdio.h>
#include <string.h>
struct pseudo_header
{
int var1;
int var2;
char name[25];
};
void csum(const unsigned short* ptr, int nbytes)
{
unsigned long sum = 0;
for(int i = 0; i < sizeof(struct pseudo_header); i++)
{
printf("%#8x\n", ptr[i]);
sum+= ptr[i];
}
printf("%#8x", sum);
}
int main() {
struct pseudo_header psh = {0};
char datagram[4096];
psh.var1 = 10;
psh.var2 = 20;
strcpy(psh.name, "Test");
memcpy(datagram, &psh, sizeof(struct pseudo_header));
csum((unsigned short*)datagram, sizeof(struct pseudo_header));
return 0;
}
它看起来很有效,但我无法验证这一点。任何帮助表示赞赏。
答案 0 :(得分:3)
不,取消引用已设置为从char*
到short*
的强制转换结果的指针的行为是 undefined ,除非{ {1}}指向最初是char*
对象或数组;你的不是。
分析内存的定义良好的方式(在C和C ++中)是使用short
,但要注意不要遍历内存以便到达不属于您的程序的区域。 / p>
答案 1 :(得分:1)
基本上这是有效的,因为你用零清除了结构。 = {0}。
您可以为函数指定结构struct * pseudo_header的指针。
我会看到对齐问题。
如果我必须在结构之前添加一个pragma pack()语句,然后在函数内部转换为unsigned char *,我会检查sizeof(struct ..)是否为期望值33。
使用25个字符长度名称测试您的函数。
答案 2 :(得分:0)
short
至少是两个字节。因此,如果要对所有字节求和,则转换为short*
是错误的。而是转为unsigned char*
。
答案 3 :(得分:0)
使用char *
以外的任何类型对指针进行强制转换(别名)违反了严格别名规则。 Gcc将根据严格别名规则的假设进行优化,并可能导致有趣的错误。只有使用memcpy
才能真正安全地绕过严格的别名规则。 Gcc支持memcpy作为编译器内在函数,因此可以优化到副本中。
或者,您可以使用-fno-strict-aliasing标志禁用严格别名。
PS - 我不清楚联盟是否提供了一种适合严格别名规则的方法。