相关疑难解决方法(0)

使用memcpy将struct转换为char数组

我试图将以下结构转换为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'

任何帮助将不胜感激.

谢谢

c c++ arrays struct

5
推荐指数
1
解决办法
625
查看次数

假设我们有结构填充,int的大小为4,double的大小为8字节,下面这段代码中结构的大小是多少

任何人都可以告诉我,下面显示的结构的大小是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.

c structure padding

5
推荐指数
1
解决办法
73
查看次数

为什么结构的大小与其成员的总和不同?

可能重复:
为什么structof sizeof不等于每个成员的sizeof之和?

如果我实现下面的代码,我的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)

c sizeof

4
推荐指数
1
解决办法
279
查看次数

C++ Sizeof给出了不可预测的结果

可能重复:
为什么'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)

c++ debugging visual-c++

4
推荐指数
1
解决办法
915
查看次数

C struct:没有填充的连续字段?

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

c struct padding

4
推荐指数
1
解决办法
353
查看次数

包含两个指针的struct的大小

这个结构的大小是多少?(32位系统计算.不是64位.)

struct list_element
{
  short data;
  struct list_element* next;
  struct list_element* prev;
};
Run Code Online (Sandbox Code Playgroud)

我试过用这些公式计算大小:

  1. (sizeof(list_element*)+ sizeof(短))+((sizeof(list_element*)*2)

    • (4 + 2)+(4*2)= 6 + 8 = 14
  2. (sizeof(短))+(sizeof(list_element*)*2)

    • 2 +(4*2)= 2 + 8 = 10
  3. (sizeof(list_element*)+ sizeof(list_element*)+ sizeof(short))+(sizeof(list_element*)*2)

    • (4 + 4 + 2)+(4*2)= 10 + 8 = 18
  4. (sizeof(list_element*)+ sizeof(list_element*)+ sizeof(short))

    • (4 + 4 + 2)= 10

但是,他们没有返回正确的答案.你用什么公式来计算这个结构的大小?

更新:

我的老师说我们忽略了数据对齐...希望这不会让任何人失去太多,因为你使用了处理与代码和结构的数据对齐...

更新2 感谢您的帮助和数据对齐介绍.

答案是10没有数据对齐......不知道为什么我急于在C中使用数据对齐......这很有趣吗?

此外,数据对齐的答案是12.正如你们解释的那样,你必须对齐短路以匹配整数.因此,你有(2 +(2个额外字节))+ 4 + 4 = 12.

c size struct

4
推荐指数
1
解决办法
946
查看次数

结构末尾的未命名位域的目的是什么

我正在学习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位未命名位字段用于让以下位从一个新字节开始.但是,我不明白为什么在结构的末尾有另一个未命名的位字段.它的目的是什么?有必要吗?

c memory-alignment bit-fields

4
推荐指数
2
解决办法
1627
查看次数

在sockaddr和sockaddr_in之间进行转换

我遇到了一个套接字编程教程,其中引用了它

“指向结构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)

c++ network-programming

4
推荐指数
2
解决办法
1810
查看次数

结构上的位移

我不确定这是否可能由于结构填充和对齐而实现,但是假设您通过将结构对齐到 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)

c bit-shift

4
推荐指数
1
解决办法
644
查看次数

如何最小化struct-type的内存使用?

对于Connect Four游戏的转置表(通常是哈希表),我想有效地使用内存(以存储尽可能多的元素).一个表元素必须存储以下信息:

  • 锁:无符号64位
  • 移动:[0..6] - >无符号3位
  • 得分:[ - 2000..2000] - >签名12位
  • flag:VALID,UBOUND,LBOUND: - > unsigned 2 bit
  • 高度:[ - 1..42]: - >签名7位

首先,我尝试了以下数据结构,需要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)

c c++ memory-management alignment

3
推荐指数
1
解决办法
2794
查看次数