c - 通过指向指针结构的指针访问内存

标签 c pointers structure

假设我有 N 字节的连续内存:

char A[N];

| | | | | | | | | | | | | | | | | | | |

我想像这样访问内存:

|__ _|__ _| | | | | | | | | | | | | | |

前两个 block 为 4 字节长,其余为 1 字节长。我想创建一个基于该内存的结构,以便以这种方式轻松访问内存。

我尝试了这种方法,但不起作用:

typedef struct {
    int *a,*b;
    char *c;
} mem;

mem *p;
p->a=(int*)A;
p->b=((int*)A+1);
p->c=((int*)A+2);

mem *p
p=(mem*)A;

然后使用 *(p->a)*(p->b)*(p->c)< 访问元素.

您能否建议我一种正确的方法并向我解释为什么这不起作用?

最佳答案

你应该能够这样做:

int* a;
int* b;
char* c;
char A[N] = {/* data goes here */};

a = (int*)A;
b = (int*)(A+sizeof(int));
c = A + 2*sizeof(int);

但是请注意,像这样的不同整数类型之间的类型转换在 C 中并不是明确定义的行为。代码很容易受到字节顺序的影响,无法确定有符号位将在哪里结束,这都可能导致陷阱表示等。

因此,除非您的特定编译器保证结果是什么,否则代码可能会变得困惑。当然它也是不可移植的。

编辑:请注意,上面的方法比使用结构指针更便携,尽管结构指针看起来更优雅。因为结构体可能在任何地方包含任意数量的填充字节,所以不能保证结构体指针会意识到所指向的内存是相邻分配的。

关于c - 通过指向指针结构的指针访问内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8429222/

相关文章:

html - 指南 : Full screen fixed layout webpage (header, 搜索栏、内容、事件列表和页脚)

c - 无穷大和 nan 值

我可以通过函数更改初始化的字符指针吗?

c - 当要解析的文件是由程序编写时使用解析器生成器或手动代码?

C++创建没有默认构造函数的对象数组

C - 指针和内存

c++ - 我是否在此算法中正确地重新安排了我的 LinkedList 节点?

c++ - 初始化结构 vector

c++ - vector 数组,计算点积

c - 如何列出物理磁盘?