首先,结构体里面的字符串指针输出出现乱码的问题:
相信很多遇到过这种问题的人都跟我一样写过这样的代码(好吧,或许不一样。。。):
#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;
}
运行一下:
这样,结果就对了。其实这里我还有一个疑问,坐等大神前来指导:
在第一个代码中,我同样没有给第一个字符串指针申请空间,可是它的输出为什么不是乱码呢????????
其次:结构体数组作为函数参数传值的时候,传的是指向地址的指针(首地址)而不是值,也就是说,形参和实参共享一个存储空间,如果形参发生变化,相应的实参,也就是主体结构体也会发生变化,跟普通数组的传值没什么区别!