关于结构体里面的字符串指针输出出现乱码的问题与结构体数组作为参数传值的问题
来源:互联网 发布: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
- 关于结构体里面的字符串指针输出出现乱码的问题与结构体数组作为参数传值的问题
- 结构体指针作为函数参数传递却无法传值的有关问题
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析 .
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- 关于memcpy拷贝结构体、结构体数组到字符数组(字符串)的问题
- 关于数组与指针的输出问题
- 如何正确使用指针(指针作为输出型参数)与结构体指针作为函数参数
- 关于结构体数组的赋值问题
- 《IOS_C语言》高级指针(结构体指针、结构体数组指针、结构体数组指针,作为函数的参数使用、预编译指令)
- 《IOS_作业C语言》高级指针(结构体指针、结构体数组指针、结构体数组指针,作为函数的参数使用、预编译指令)
- 数组作为函数参数的指针问题
- 结构体定义与作为函数参数的结构
- 函数用参数为 结构体指针 在VC下出现的问题
- 函数用参数为 结构体指针 在VC下出现的问题
- C#调用c++Dll结构体数组指针的问题
- Unity3D——GetComponentsInChildren<T>()方法详解
- CSS的居中
- 王朝
- 人脸检测库libfacedetection介绍
- 常用js总结
- 关于结构体里面的字符串指针输出出现乱码的问题与结构体数组作为参数传值的问题
- Kafka深度讲解+Zookeeper存储
- Vue.js与Angular、React、Ember、Polymer、Riot框架的对比
- 卸载伽卡他卡学生端后如何打开任务管理器
- java显示时间
- Java的23种设计模式
- 堆排序的链式存储
- SVN使用常用命令
- PAT 1097. Deduplication on a Linked List (25)(链表问题)(链表分段)