成员变量指针指向 文字常量区、堆区空间、栈区空间

成员变量指针指向 文字常量区、堆区空间、栈区空间

成员指针指向文件常量区
在这里插入图片描述

#include <stdio.h>
#include <string.h>


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

int main()
{
	struct Student s;
	char *p = (char *)"abc";//注意要强制转换类型,不然某些编译器会不通过

	printf("%p\n", "abc");
	printf("%p\n", p);
	
	s.age = 18;
	s.name = NULL;
	s.name = (char *)"abc";//注意要强制转换类型,不然某些编译器会不通过
	s.score = 100;
	

	printf("%d %p %d\n", s.age, s.name, s.score);
	printf("%d %s %d\n", s.age, s.name, s.score);
	
	return 0;
}

成员指针指向堆区空间
在这里插入图片描述

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

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

int main()
{
	struct Student s;
	
	s.age = 18;
	
	s.name = (char *)malloc((strlen("mike")+1) * sizeof(char));
	strcpy(s.name, "mike");
	
	s.score = 80;
	
	
	printf("%d %s %d\n", s.age, s.name, s.score);
	
	if(s.name != NULL)
	{
		free(s.name);
		s.name = NULL;
	}
	
	return 0;
}

成员指针指向栈区空间
在这里插入图片描述

#include <stdio.h>
#include <string.h>

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


int main()
{
	struct Student s;
	
	s.age = 18;
	
	char buf[100];
	s.name = buf;//指向栈区
	strcpy(buf, "mike");	
	s.score = 59;
	
	printf("%d %s %d", s.age, s.name, s.score);
	
	return 0;
}

注意事项:

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

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

int main(int argc, char const *argv[])
{
	struct Student *p;
	
	//给p分配内存
	p = (struct Student *)malloc(sizeof(struct Student));
	if(p == NULL)
	{
		printf("分配失败");
		return -1;
	}
	
	//需要给mike\0分配足够的空间
	p->name = (char *)malloc(strlen("mike") + 1);
	
	p->age = 18;
	strcpy(p->name, "mike");
	p->score = 99;
	
	printf("%d, %s, %d\n", p->age, p->name, p->score);

//因为结构体的name是个指针,在堆区分配了一个区域给它
//释放结构体中的name所指向的堆区内存
	if(p->name != NULL)
	{
		free(p->name);
		p->name = NULL;
	}
	
//释放结构体的堆区内存
	if(p != NULL)
	{
		free(p);
		p = NULL;
	}
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值