假设我有 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/