-3

代码:

#include <stdio.h>
#include <stdlib.h>

struct super_block {
        unsigned short s_ninodes;
        unsigned short s_nzones;
};

#define NR_SUPER 8
struct super_block super_block[NR_SUPER];

int
main()
{
        struct super_block * p;
        struct super_block * s;
        char b_data[] = "2020";

        for(p = &super_block[0] ; p < &super_block[NR_SUPER] ; p++) {
                p->s_ninodes= 0;
                p->s_nzones = 0;
        }

        s = super_block;

        *(s) = *((struct super_block *) b_data);
        printf("%d\n%d\n", s->s_ninodes, s->s_nzones);
        return 0;
}

问题是:我想

s->s_ninodes =20 and s->s_nzones=20, how to solve it ?

为什么"*(s) = *((struct super_block *) b_data);"不行?

谢谢

4

1 回答 1

2

b_data数组长 5 个字节(“2020”=> 4 个字符加上结尾\0)。假设您的结构已打包,并且sizeof(short) == 2您的struct superblock对象将接收字符串中字符的字节值。在这里,给定常见的 ASCII 值,您可能会得到(以十六进制方式避免字节序讨论)s->s_ninodes == s->s_nzones == 0x6260

如果您想坚持使用这种模糊方法来影响结构中的数据,那么只需尝试使用short b_data[] = {20,20},并祈祷您的结构被打包......(或添加一个__attribute__((packed))标记)。无论如何,在没有充分理由的情况下做出这种做作是一种非常糟糕__attribute__((packed))的做法(通常,充分的理由是检索需要解析的数据流,并且在这种情况下,您最有可能在数据结构定义)。

编辑:我不知道为什么,但是在做这些事情时,在我看来,使用memcpy()而不是简单的做作使它更清晰(我猜更容易阅读和发现缓冲区溢出)。

于 2013-04-12T08:50:11.967 回答