一个指针,可以将地址增加9个字节

时间:2015-10-22 07:55:21

标签: c++ c

当我递增它时,是否有一种正确的方法来声明一个跳过9个字节的指针?

一个例子:

sometype* ptr = 0x0;
ptr+1; //ptr points now to 0x9
ptr+2; //ptr points now to 0x12

3 个答案:

答案 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;
}

但是当然要注意一些编译器的优化,而且只是因为你做错了什么:)