当我递增它时,是否有一种正确的方法来声明一个跳过9个字节的指针?
一个例子:
sometype* ptr = 0x0;
ptr+1; //ptr points now to 0x9
ptr+2; //ptr points now to 0x12
答案 0 :(得分:3)
您可以创建一个结构,它将精确地保存9个字节,因此您指向该结构变量的指针将增加9。
但是,您的结构可能会由编译器获得padded/memory aligned(通常为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
在我的平台上仍未展开。
答案 1 :(得分:3)
struct
的解决方案通常无法正常工作。
但是,如果我们这样做(为了清楚起见使用两个typedef
)
typedef char base_type[9];
typedef base_type *some_type;
或(避免需要第一个typedef
,但让事情变得更加神秘)
typedef char (*some_type)[9];
然后,给定some_type
类型的适当初始化变量,递增将增加9
个字符。
答案 2 :(得分:0)
正如@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;
}
但是当然要注意一些编译器的优化,而且只是因为你做错了什么:)