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

来源:互联网 发布:sql 前几个字符相同 编辑:程序博客网 时间:2024/06/06 07:23

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

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

#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;}
运行一下:



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

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


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







0 0
原创粉丝点击