C 如何使用字符串赋值结构?

C 如何使用字符串赋值结构?,c,C,代码: #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

代码:

#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)=*((struct super_block*)b_data);”
不正常


谢谢

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

如果您想坚持使用这种模糊方法来影响结构中的数据,那么只需尝试使用
short b_data[]={20,20}
,并祈祷您的结构已打包。。。(或添加一个
\uuuuuuuuuuuuuuuuuuuuuu属性((打包))
标记)。无论如何,在没有充分理由的情况下进行这种矫揉造作是一种非常糟糕的做法(通常,充分的理由是检索需要解析的数据流,在这种情况下,您很可能在数据结构定义中找到
\uu属性(packed))
内容)


编辑:我不知道为什么,但在做这些事情时,我觉得使用
memcpy()
而不是直接的矫揉造作会让事情更清楚(我想更容易阅读并发现缓冲区溢出)。

你读过一本好的C编程书吗?您是否使用所有警告和调试信息编译代码(例如,在Linux上使用
gcc-Wall-g
)?您是否使用调试器(例如Linux上的
gdb
)逐步运行代码?
s=super\u块
?在C语言中合法吗?字符串文字
“20”
无符号短值
20
@MyMNEeo不同:由于
s
是指针,而
super\u block
是相同类型的数组,因此赋值
s=superblock是合法的。
*(s)=*((结构超级块*)b_数据)这是不合法的。如果
b_data
hold unsigned short means,则它将生效。谢谢。“*((struct d_super_block*)s)=*((struct d_super_block*)bh->b_data);”我想检查内核0.12的super.c中read_super()中的这段代码。bh->b_数据的类型是“char*”,所以我想试试。
s->s_ninodes =20 and s->s_nzones=20, how to solve it ?