关于结构体里面的字符串指针输出出现乱码的问题与结构体数组作为参数传值的问题

首先,结构体里面的字符串指针输出出现乱码的问题:

相信很多遇到过这种问题的人都跟我一样写过这样的代码(好吧,或许不一样。。。):

#include<stdio.h>
#include<string.h>
typedef struct{
	int age;
	const char* name;
	const char* id;
}person;
person p();
int main(){
	person s[1];
	s[0]= p();
	printf("%s %s",s[0].name,s[0].id);
	 return 0;
} 
person p(){
	person a;
    char name[20];
    char id[20];
	scanf("%s %s",name,id);
	a.age=44;
	a.name=name;
	a.id=id;
	return a;
}

我们在定义结构体的属性的时候,如果有字符串属性,那么我们一般都用字符串指针定义,而不用字符串数组定义,原因是用字符串指针的话它的长度是不限的,而字符串数组必须先知道它的大小,很明显没有字符串指针灵活~~于是我就用了字符串指针,运行上面的代码,看似没错,结果如图:



第一行是输入,第二行是输出,应该与输入相同,但我们发现第二行的第二个字符串居然变成了一个表情符,这tm是什么鬼!!!于是就百度了好半天,,,原因如下:

结构体中name,id用的是字符串指针而不是字符串数组,所以需要给字符串在堆上申请内存然后再赋值,也就是说,我们定义的字符串指针是没有内存空间的,需要先申请空间之后再赋值,于是就发现了这样一个字符串函数:strdup(str); strdup()函数会计算出字符串的长度,然后调用malloc函数在堆上申请相应的空间,最后把字符串的所有字符复制到堆上,代码就变成了下面这个:

#include<stdio.h>
#include<string.h>
typedef struct{
	int age;
	const char* name;
	const char* id;
}person;
person p();
int main(){
	person s[1];
	s[0]= p();
	printf("%s %s",s[0].name,s[0].id);
	 return 0;
} 
person p(){
	person a;
    char name[20];
    char id[20];
	scanf("%s %s",name,id);
	a.age=44;
	a.name=<span style="background-color: rgb(255, 0, 0);">strdup(name)</span>;
	a.id=<span style="background-color: rgb(255, 0, 0);">strdup(id)</span>;
	return a;
}
运行一下:



这样,结果就对了。其实这里我还有一个疑问,坐等大神前来指导:

在第一个代码中,我同样没有给第一个字符串指针申请空间,可是它的输出为什么不是乱码呢????????


其次:结构体数组作为函数参数传值的时候,传的是指向地址的指针(首地址)而不是值,也就是说,形参和实参共享一个存储空间,如果形参发生变化,相应的实参,也就是主体结构体也会发生变化,跟普通数组的传值没什么区别!







  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值