假设我有一系列字符:
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?
}
我想指出p
从buffer
开始,到buffer + 12
等。
答案 0 :(得分:3)
要考虑的一个问题是char缓冲区可能没有为结构正确对齐(在这种情况下,它的int成员num1
和num2
)。根据平台和实现,可能需要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
}
...是的,这假设结构在内存中是连续的,中间没有填充。