结构体里的成员数组和成员指针

struct test{
    int i;
    char *p;
};

 struct test *str;
    int a = 1;
    char *b = "ioiodddddddddddd";

    str = (struct test *)malloc(sizeof(struct test));//结构体指针不为null
    str->i = a;
    str->p = b;
    printf("%s\n",str->p);  //输出ioiodddddddddddd
return 1;

--------------------------------------------------------
struct test{
    int i;
    char s[10];
};
struct test *str;
str = (struct test *)malloc(sizeof(struct test));//结构体指针不为null
printf("%x\n",str);         //输出 72403170
printf("%x\n",str->s);      //输出 72403174
return 1;

总结:不管结构体指针是否为null,访问结构体成员数组得到的其实都是成员数组的相对地址;访问成员指针得到的是相对地址存储的变量(地址)所指向的内容。 

另个佐证的例子

一下代码会报错:Segmentation Fault

typedef struct Node//定义了一个结构体
{
    int size;
    char *data;
}S_Node;
int main()
{
    struct Node *node1;
    node1 = (struct Node *)malloc(sizeof(struct Node));//指针所指向的地址
    char str[3]="ab";
    node1->size=3;
    memcpy(node1->data, str, 3);
    return 0;
}

将结构体中的指针改为数组形式, 正常运行

typedef struct Node//定义了一个结构体
{
    int size;
    char data[3];
}S_Node;
int main()
{
    struct Node *node1;
    node1 = (struct Node *)malloc(sizeof(struct Node));//指针所指向的地址
    char str[3]="ab";
    node1->size=3;
    memcpy(node1->data, str, 3);
    return 0;
}

一个说明: 如果一个结构体没有分配内存,在访问成员指针必然抛出异常, 如果分类内存了,访问成员指针是没有问题的,只是其内容没有具体定义,应该是个随机值, 所以以下第一段代码没问题, 第二段代码跑出异常

代码段1:

#include <stdio.h>

typedef struct
{
    char *name;
    int age;
    float score;
}Student;

int main(void)
{
    Student stu ;
    Student*ps = &stu;

    if(ps->age){
        printf("1\n");
    }
    if(ps->score){
        printf("2\n");
    }
    if(ps->name){
        printf("3\n");
    }
    return 0;
}

代码段2:

#include <stdio.h>
struct str{
    int len;
    char *s;
};

struct foo {
    struct str *a;
};

int main(int argc, char** argv) {
    struct foo f={0};
    if (f.a->s) {
        printf( f.a->s);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/asdfsadfasdfsa/article/details/87897734