是否有适当的方法来声明一个指针,当我增加它时,指针会跳过9个字节?
举个例子:
sometype* ptr = 0x0;
ptr+1; //ptr points now to 0x9
ptr+2; //ptr points now to 0x12发布于 2015-10-22 08:27:59
除非代码专门控制填充,否则struct-based解决方案通常无法工作。
但是,如果我们这样做(为了清晰起见,可以使用两个typedef)
typedef char base_type[9];
typedef base_type *some_type;或者(避免对第一个typedef的需求,但使事情变得更加神秘)
typedef char (*some_type)[9];然后,给定some_type类型的适当初始化变量,增量将增加9字符。
发布于 2015-10-22 08:11:12
您可以创建一个结构,它将准确地容纳9个字节,因此指向该结构变量的指针将增加9。
但是,您的结构可以由编译器获得填充/存储器对齐 (通常是8字节的乘法)。为了避免这种情况,可以使用特定于GCC的属性__attribute__ ((__packed__))。
#include <stdio.h>
struct padded1 {
int var1;
char var2;
int var3;
};
struct padded2 {
char data[9]; // my compiler still not apply padding here
};
struct __attribute__ ((__packed__)) unpadded {
char data[9];
};
int main(int argc, char **argv)
{
printf("Size of padded struct: %ld\n", sizeof(struct padded1));
printf("Size of padded struct: %ld\n", sizeof(struct padded2));
printf("Size of unpadded struct: %ld\n", sizeof(struct unpadded));
return 0;
}请注意,struct padded2在我的平台上仍然是未填充的。
发布于 2015-10-22 08:12:45
正如@SingerofTheFall所说,你可以通过一些技巧来实现这一点,比如
char *input = "0123456789";
struct move_struct {
char c[3];
};
int main() {
cout << "size: " << sizeof(move_struct) << endl;
move_struct * temp_ptr = (move_struct *)(input);
++temp_ptr;
char *result = (char *)(temp_ptr);
cout << "Expected: "<< (input+sizeof(move_struct)) << "\n"
<< "Result: " << result;
return 0;
}但是,当然要注意一些编译器优化,对我来说,您做了一些错误的事情:)
https://stackoverflow.com/questions/33275934
复制相似问题