首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个指针,它将地址增加整整9个字节。

一个指针,它将地址增加整整9个字节。
EN

Stack Overflow用户
提问于 2015-10-22 07:55:21
回答 3查看 145关注 0票数 2

是否有适当的方法来声明一个指针,当我增加它时,指针会跳过9个字节?

举个例子:

代码语言:javascript
复制
sometype* ptr = 0x0;
ptr+1; //ptr points now to 0x9
ptr+2; //ptr points now to 0x12
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-22 08:27:59

除非代码专门控制填充,否则struct-based解决方案通常无法工作。

但是,如果我们这样做(为了清晰起见,可以使用两个typedef)

代码语言:javascript
复制
typedef char base_type[9];
typedef base_type *some_type;

或者(避免对第一个typedef的需求,但使事情变得更加神秘)

代码语言:javascript
复制
typedef char (*some_type)[9];

然后,给定some_type类型的适当初始化变量,增量将增加9字符。

票数 3
EN

Stack Overflow用户

发布于 2015-10-22 08:11:12

您可以创建一个结构,它将准确地容纳9个字节,因此指向该结构变量的指针将增加9。

但是,您的结构可以由编译器获得填充/存储器对齐 (通常是8字节的乘法)。为了避免这种情况,可以使用特定于GCC的属性__attribute__ ((__packed__))

代码语言:javascript
复制
#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在我的平台上仍然是未填充的。

票数 3
EN

Stack Overflow用户

发布于 2015-10-22 08:12:45

正如@SingerofTheFall所说,你可以通过一些技巧来实现这一点,比如

代码语言:javascript
复制
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;
}

但是,当然要注意一些编译器优化,对我来说,您做了一些错误的事情:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33275934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档