[英]Cast char* to short*
我想总结一下我的结构的所有字节。 我读到应该将结构的指针从char转换为short。 为什么?
从char到short使用(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;
}
看起来可行,但我无法验证。 任何帮助表示赞赏。
不,取消引用已设置为从char*
转换为short*
的结果的指针的行为是不确定的 ,除非char*
指向的数据最初是short
对象或数组; 你的不是。
明确定义的分析内存的方法(在C和C ++中)是使用unsigned char*
,但请注意不要遍历您的内存,以便到达程序不拥有的区域。
基本上这是可行的,因为您将结构清除为零。 = {0}。
您可以为该函数提供指向结构struct * pseudo_header的指针。
我会看到对齐问题。
如果必须在结构之前添加pragma pack()语句,然后将其强制转换为函数内的unsigned char *,我将检查sizeof(struct ..)的期望值33。
使用25个字符的长度名称测试您的功能。
short
是至少两个字节。 因此,如果您想对所有字节求和,则强制转换为short*
是错误的。 而是转换为unsigned char*
。
强制转换(别名)除char *
以外的任何类型的指针都违反了严格的别名规则。 Gcc将基于严格的别名规则的假设进行优化,并可能导致有趣的错误。 严格的别名规则唯一真正安全的方法是使用memcpy
。 Gcc支持将memcpy作为内在的编译器使用,因此可以优化到副本中。
另外,您可以使用-fno-strict-aliasing标志禁用严格别名。
PS-我不清楚工会是否提供绕过严格别名规则的合适方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.