将struct项目转换为c中的字节数组

时间:2016-09-29 18:05:13

标签: c arrays

假设我有一系列字符:

char buffer[1024];

实际上,数组按顺序包含结构链。

struct MyStruct {
    char name[4];
    int num1;
    int num2; 
}

我想遍历数组:

MyStruct *p;
for(int i = 0;i < sizeof(buffer);i += sizeof(MyStruct))
{
    // how can I point p to some place in buffer here?    
}

我想指出pbuffer开始,到buffer + 12等。

3 个答案:

答案 0 :(得分:3)

要考虑的一个问题是char缓冲区可能没有为结构正确对齐(在这种情况下,它的int成员num1num2)。根据平台和实现,可能需要4字节,8字节或16字节对齐。出于这个原因,一种替代方法是最初以MyStruct的形式声明缓冲区,然后通过char指针访问它:

MyStruct buffer[1024 / sizeof(MyStruct)];
char * cp = (char *) buffer;
// fill the buffer via cp
for (size_t i = 0; i < sizeof(buffer); ++i)
{
    // do stuff with buffer[i]
}

如果无法实现这种方法,则需要将缓冲区复制到另一个安全对齐的缓冲区;例如:

size_t n = sizeof(buffer) / sizeof(MyStruct);
MyStruct * p = (MyStruct *) malloc(n * sizeof(MyStruct));
if (!p) { exit(EXIT_FAILURE); }
memcpy(p, buffer, n * sizeof(MyStruct));  // copy buffer to p
for (size_t i = 0; i < n; ++i)
{
    // do stuff with p[i]
}

答案 1 :(得分:1)

首先请注意,您假设这将起作用。结构的元素之间没有填充。说完了这个:

MyStruct *s = (MyStruct*)(buffer + i)

答案 2 :(得分:0)

p指向缓冲区中的第一个结构,然后在每次迭代时递增它:

MyStruct *p= (struct MyStruct *) buffer;
for(int i = 0; i < sizeof(buffer); i += sizeof(MyStruct), p++)
{
    // your code 
}

...是的,这假设结构在内存中是连续的,中间没有填充。