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,访问结构体成员数组得到的其实都是成员数组的地址(如果为null则表示起始地址从0开始);访问成员指针得到的是相对地址存储的变量(地址)所指向的内容。
另个佐证的例子
一下代码会报错:Segmentation Fault, 因为分配内存后data己值为0x0,即为null
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;
}