Cast char *简称*

时间:2018-03-04 07:28:01

标签: c++ c

我想总结一下我结构的所有字节。我读到我应该将我的结构的指针从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;
}

它看起来很有效,但我无法验证这一点。任何帮助表示赞赏。

4 个答案:

答案 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 - 我不清楚联盟是否提供了一种适合严格别名规则的方法。