代码:
#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);"
不正常?
谢谢
答案 0 :(得分:2)
数组b_data
长5个字节(“2020”=&gt; 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()
而不是简单的做法使其更清晰(更容易阅读和发现缓冲区溢出我猜)。