如何通过指针访问结构的第二个成员?

mil*_*bos -2 c struct pointer-arithmetic

我已经看到结构的第一个地址同时是该结构的第一个成员的第一个地址。现在我想了解的是,为什么我总是需要双指针在结构中移动:

#include <stdio.h>
#include <stdlib.h>

struct foo
{
    char *s;
    char *q;
};

int main()
{
    struct foo *p = malloc(sizeof(struct foo));
    char ar[] = "abcd\n";
    char ar2[] = "efgh\n";
    *(char**)p = ar;
    *(char**)((char**)p+1) = ar2; //here pointer arithmetic (char**)p+1

    printf("%s\n",p->q);
}
Run Code Online (Sandbox Code Playgroud)

问题是,为什么我需要char**而不是 simple char*?我在汇编程序中看到的是在简单的情况下char*,算术会表现得像正常一样char。也就是说 -> 的表达式(char*)p+1会将地址p仅移动一个字节(而不是8地址为 8 个字节长)。但是类型char* 地址,所以我不明白为什么算术的行为类似于取消引用类型(纯字符 -> 一个字节)。

所以对我来说唯一的解决方案是添加另一个间接char**,其中指针算术神奇地8作为大小。那么为什么在结构中需要这种奇怪的转换呢?

Pau*_*vie 7

你在做有趣的事情。你应该这样做:

struct foo *p = malloc(sizeof(struct foo));
char ar[] = "abcd\n";
char ar2[] = "efgh\n";
p->s = ar;
p->q = ar2; 
Run Code Online (Sandbox Code Playgroud)