繁体   English   中英

将char *强制转换为short *

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM