我试图将以下结构转换为char数组,以便我可以通过串行端口发送它.
struct foo
{
uint16_t voltage;
char ID ;
char TempByte;
char RTCday[2];
char RTCmonth[2];
char RTCyear[2];
char RTChour[2];
char RTCmin[2];
char Sepbyte;
}dvar = { 500, 'X' , '>' , "18" , "10" , "15" , "20" , "15" , '#'};
Run Code Online (Sandbox Code Playgroud)
然后我使用以下代码将其转换为char数组:
char b[sizeof(struct foo)];
memcpy(b, &dvar, sizeof(struct foo));
Run Code Online (Sandbox Code Playgroud)
但是由于某种原因,我在char数组中得到了这些尾随值
0x0A 0xFF
Run Code Online (Sandbox Code Playgroud)
我最初认为它是获取值,因为当我将它转换为char数组时,它实际上将它转换为字符串,所以我虽然是NULL'\ 0'
任何帮助将不胜感激.
谢谢
任何人都可以告诉我,下面显示的结构的大小是24而不是20.
typedef struct
{
double d; // this would be 8 bytes
char c; // This should be 4 bytes considering 3 bytes padding
int a; // This would be 4 bytes
float b; // This would be 4 bytes
} abc_t;
main()
{
abc_t temp;
printf("The size of struct is %d\n",sizeof(temp));
}
Run Code Online (Sandbox Code Playgroud)
我的假设是当我们考虑填充时结构的大小将是20但是当我运行此代码时,大小打印为24.
如果我实现下面的代码,我的sizeof(*zip)输出是56. [10 + 10 + 4 + 4*8] byte = 56
typedef struct{
char a[10];
char b[10];
int c;
double d,f,g,h;
}abc_test;
abc_test zip[] =
{
{"Name" ,"Gender", 0,100,200,300,400},
{"Name" ,"Gender", 0,100,200,300,400}
};
Run Code Online (Sandbox Code Playgroud)
但是当我实现下面的代码时,我的sizeof(*zip)输出是440. [100 + 100 + 100 + 100 + 4 + 4*8] = 436,我的问题是另外4个?
typedef struct{
char a[100];
char b[100];
char i[100];
char j[100];
int c;
double d,f,g,h;
}abc_test;
abc_test zip[] =
{
{"Name" ,"Gender","age","mode", 0,100,200,300,400},
{"Name" ,"Gender","age","mode", 0,100,200,300,400}
};
Run Code Online (Sandbox Code Playgroud) 可能重复:
为什么'sizeof'给出错误的测量?
我有一个名为CBUFFER_PEROBJECT的结构:
struct CBUFFER_PEROBJECT
{
D3DXMATRIX Final;
D3DXMATRIX Rotation;
};
Run Code Online (Sandbox Code Playgroud)
在另一堂课中,我这样做:
...
bd.ByteWidth = sizeof(CBUFFER_PEROBJECT);
...
Run Code Online (Sandbox Code Playgroud)
我发现D3DXMATRIX的大小是64,所以64 + 64 = 128(对吧?).但我的编译器正在玩我的技巧(Visual C++),因为当我调试程序时,bd.ByteWidth变为132,所以我去了立即窗口(Visual Studio),并输入:
sizeof(D3DXMATRIX) + sizeof(D3DXMATRIX)
Run Code Online (Sandbox Code Playgroud)
结果是:
128
Run Code Online (Sandbox Code Playgroud)
但是bd.ByteWidth变为132,当我在"立即窗口"中键入以下内容时:
sizeof(CBUFFER_PEROBJECT)
Run Code Online (Sandbox Code Playgroud)
它给了我:
128
Run Code Online (Sandbox Code Playgroud) any_t是任何类型的(int,struct something,...).
考虑这个结构:
struct my_struct {
any_t val,
any_t array[10]
}
Run Code Online (Sandbox Code Playgroud)
如果我定义一个变量v:
struct my_struct v;
Run Code Online (Sandbox Code Playgroud)
&v.val作为11 any_t项的数组使用是否安全?
any_t *p = &v.val;
f(p[0]);
f(p[5]);
f(p[10]);
Run Code Online (Sandbox Code Playgroud)
是否保证不会在val和之间添加填充array?
这个结构的大小是多少?(32位系统计算.不是64位.)
struct list_element
{
short data;
struct list_element* next;
struct list_element* prev;
};
Run Code Online (Sandbox Code Playgroud)
我试过用这些公式计算大小:
(sizeof(list_element*)+ sizeof(短))+((sizeof(list_element*)*2)
- (4 + 2)+(4*2)= 6 + 8 = 14
(sizeof(短))+(sizeof(list_element*)*2)
- 2 +(4*2)= 2 + 8 = 10
(sizeof(list_element*)+ sizeof(list_element*)+ sizeof(short))+(sizeof(list_element*)*2)
- (4 + 4 + 2)+(4*2)= 10 + 8 = 18
(sizeof(list_element*)+ sizeof(list_element*)+ sizeof(short))
- (4 + 4 + 2)= 10
但是,他们没有返回正确的答案.你用什么公式来计算这个结构的大小?
更新:
我的老师说我们忽略了数据对齐...希望这不会让任何人失去太多,因为你使用了处理与代码和结构的数据对齐...
更新2 感谢您的帮助和数据对齐介绍.
答案是10没有数据对齐......不知道为什么我急于在C中使用数据对齐......这很有趣吗?
此外,数据对齐的答案是12.正如你们解释的那样,你必须对齐短路以匹配整数.因此,你有(2 +(2个额外字节))+ 4 + 4 = 12.
我正在学习C.在C Primer Plus中,我看到了一个字段示例如下:
struct box_props {
bool opaque : 1;
unsigned int fill_color : 3;
unsigned int : 4;
bool show_border : 1;
unsigned int border_color : 3;
unsigned int border_style : 2;
unsigned int : 2;
};
Run Code Online (Sandbox Code Playgroud)
我知道中间的4位未命名位字段用于让以下位从一个新字节开始.但是,我不明白为什么在结构的末尾有另一个未命名的位字段.它的目的是什么?有必要吗?
我遇到了一个套接字编程教程,其中引用了它
“指向结构sockaddr_in的指针可以转换为指向结构sockaddr的指针,反之亦然 ”
我不明白如何将sockaddr_in强制转换为sockaddr。将Big类型的指针转换为Small类型的指针应具有UD行为。
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
struct sockaddr_in {
short int sin_family; // Address family, AF_INET
unsigned short int sin_port; // Port number
struct in_addr sin_addr; // Internet address
unsigned char sin_zero[8]; // Same size as struct sockaddr
};
Run Code Online (Sandbox Code Playgroud)
如何不能强制转换?将它们相互投射是不安全的吗?
如果我有一个A类只有两个整数,而B类则只有4个整数。如果我有一个类型为B的指针并将其强制转换为类型A,那么请确保我可以获取前两个元素。但是,如果类A具有首先声明的2个字符和之后声明的2个整数,则指针将无法正确获取值,因为在这种情况下,对象布局将有所不同。
编辑1:
class Anu
{
public:
char a;
int b;
Anu()
{
a='a';
}
};
class Anurag
{ …Run Code Online (Sandbox Code Playgroud) 我不确定这是否可能由于结构填充和对齐而实现,但是假设您通过将结构对齐到 4/8 字节来解决这一问题,是否可以在结构上进行位移,就好像它是单个变量一样?
我想要做的是获取一个字符串(最多 8 个字节)并将其移入 64 位变量的高位。
就像我这样做:
#include <stdint.h>
#include <string.h>
void shiftstr(uint64_t* t,char* c,size_t len){
memcpy(t, c, len);
//now *t==0x000000617369616b
*t<<=(sizeof(uint64_t)-len)*8;
//now *t==0x617369616b000000
}
int main(){
uint64_t k = 0;
char n[] = "kaisa";
shiftstr(&k, n,strlen(n));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这工作得很好,但是如果我有,而不是 a uint64_t, 二uint32_t,作为单独的变量或结构怎么办?
#include <stdint.h>
#include <string.h>
struct U64{
uint32_t x;
uint32_t y;
};
void shiftstrstruct(struct U64* t, char* c, size_t len){
memcpy(t, c, len);
/*
At this point I think
x == 0x7369616b …Run Code Online (Sandbox Code Playgroud) 对于Connect Four游戏的转置表(通常是哈希表),我想有效地使用内存(以存储尽可能多的元素).一个表元素必须存储以下信息:
首先,我尝试了以下数据结构,需要24个字节:
struct TableEntry1
{
unsigned __int64 lock;
unsigned char move;
short score;
enum { VALID, UBOUND, LBOUND } flag;
char height;
};
Run Code Online (Sandbox Code Playgroud)
重新排列元素后,它需要16个字节(我找到了这个行为的答案):
struct TableEntry2
{
unsigned __int64 lock;
enum { VALID, UBOUND, LBOUND } flag;
short score;
char height;
unsigned char move;
};
Run Code Online (Sandbox Code Playgroud)
我的最后一次尝试是:
struct TableEntry3
{
unsigned __int64 lock;
unsigned int move:3;
int score:12; …Run Code Online (Sandbox Code Playgroud)