c语言给结构体指针申请空间,结构体中的指针变量申请空间问题
本人声明了一个结构体包含id,age,name三个属性
struct studentInfo
{
int id;
int age;
char *name[20];
};
本人又创建了一个双向循环链表,链表的每个节点的数据域是一个学生的信息;
然后希望遍历链表输出学生信息;
但是为姓名属性申请空间好像有问题,每次输出都是最后一个输入的学生的姓名,年龄和id都对;
代码如下:
#include
#define ERROR -1
#define OK 0
#define NOTEXIST 1
typedef int State;
struct studentInfo
{
int id;
int age;
char *name;
};
struct Node
{
struct studentInfo student;
struct Node *prior;
struct Node *next;
}Node;
typedef struct Node * LinkList;
//创建链表
State createLinkList(LinkList *L) {
(*L) = (LinkList)malloc(sizeof(Node));
if ((*L) == NULL)
return ERROR;
(*L)->next = (*L);
(*L)->prior = (*L);
return OK;
}
//向链表中添加数据
//链表中添加数据有两种方式
//一种头插法一种尾插法
//尾插法需要寻找链表尾部
State addDataFirst(LinkList *L, struct studentInfo student) {
LinkList p;
p = (LinkList)malloc(sizeof(Node));
p->student = student;
p->next = (*L)->next;
(*L)->next->prior = p;
(*L)->next = p;
p->prior = (*L);
printf(“%d,%d,%s\n”, student.id, student.age, student.name);
return OK;
}
State addDataLast(LinkList *L, struct studentInfo student) {
LinkList p;
p = (LinkList)malloc(sizeof(Node));
p->student = student;
(*L)->prior->next = p;
p->prior = (*L)->prior;
(*L)->prior = p;
p->next = (*L);
printf(“%d,%d,%s\n”, student.id, student.age, student.name);
return OK;
}
int main() {
struct studentInfo student;
LinkList L;
LinkList p;
State state = 0;
createLinkList(&L);
student.name = (char *)malloc(20 * sizeof(char));
scanf(“%d,%d,%s”, &student.id,&student.age,student.name);
state = addDataLast(&L, student);
if (!state)
printf(“Add student sucessed!\n”);
scanf(“%d,%d,%s”, &student.id, &student.age, student.name);
state = addDataFirst(&L, student);
if (!state)
printf(“Add student sucessed!\n”);
p = L->next;
while (p != L) {
student = p->student;
printf(“%d,%d,%s\n”, student.id, student.age, student.name);
p = p->next;
}
return OK;
}
运行结果:
但是,假如将name属性声明为一个数组,主函数中不为它申请空间,就不会报错;
代码:
struct studentInfo
{
int id;
int age;
char name[20];
};
本人想提问,假如本人想把name声明为指针,本人该怎么样解决这个问题;还有就是这两种做法的区别在哪里,本人声明为指针的做法错误在哪里。
解决方案
1
你声明的是指针数组了,改成char* name即可。
1
创建链表的
(*L)->next = (*L);
(*L)->prior = (*L);
return OK;
就是几句废话
等于空不行吗?
(*L)->next =NULL;
(*L)->prior =NULL;
本人等于本人,又要二次分配Name
你丫就不当心重复分配
2
char *name[20]; 改成 char *name;
20
哥们,出现你上面那个结果是原因是深拷贝的问题导致得
1.你对student.name在main()中申请了一片空间,注意只是一片空间,当你第一次赋值之后,你传入了函数(进行的是值传递,也就是说只是传了student.name指针的副本,没有在单独开辟空间出来),此时你直接赋值给另一个结构体(由于你结构体没有等号操作符重载,因此采用默认的,只进行值得赋值,因此就只是student.name的指针本身的值付给它,并没有开辟另外的空间,暂记这个指针ptr,指向A空间)。当你第二次传递进来的时候一样的传递ptr指针,而同样进行值赋值没创建空间。因此你第一次与第二次传递的都是ptr指针,指向的空间都是A,当你第二次重新赋值了A空间后,那么第一次同样也是指向了这个空间,那么就是第一次、第二次指向同样空间 ,里面的值当然以第二次为准,所以打印结果相同
2.基本数据类型这不一样,没有深拷贝,直接赋值即可,显示结果就不同了
3.你将char* 换成char数组当然就可以了,原因是char数组初始化结构体时就会申请出空间,那么两次就是不同的空间了,就可以保存不同的值了
嘿嘿!不好意,第一次在这上面回答问题,说的不清楚,还望谅解
1
楼上解释正确。简单说就是, 每个节点的name都指向最初malloc的那段空间。
12
引用:
Quote: 引用:
char *name[20]; 改成 char *name;
粘程序粘错了,本人声明的是char *name;但是出现了如题的问题
假如是指针,对象复制、赋值需要深拷贝,默认的是浅拷贝,也就是只是复制指针的值,并没重新申请一片内存,而假如是数组的话,会复制整个数组
10
假如定义的是char*name,那么添加新节点时需要新开辟一段空间,例如malloc(20*sizeof(char)),而不只是简单的开辟结构体空间,然后直接把传进来的结构体付给他那么简单,那样的话,你结构体里的name指针只是指向了一个临时参数里的空间,函数结束就无效了,所以出现了错误。
假如你定义的是字符数组char name[20]那就没有什么问题了
CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明结构体中的指针变量申请空间问题!
c语言给结构体指针申请空间,结构体中的指针变量申请空间问题相关推荐
- php this指针的用法,C#_C#中this指针的用法示例,本文实例展示了C#中this指针的 - phpStudy...
C#中this指针的用法示例 本文实例展示了C#中this指针的用法,对于初学者进一步牢固掌握C#有很大帮助,具体内容如下: 一.this指针是什么: 这里有一些面向对象编程的概念需要说明:类(Cla ...
- java int 指针_如何在Java中使用指针?
小编典典 Java中的所有对象都是引用,你可以像使用指针一样使用它们. abstract class Animal {... } class Lion extends Animal {... } cl ...
- 共享内存中使用指针_详解c++中字符指针数组的使用
之前有写过一篇叫c++中动态数组的使用,今来看看c++中的字符指针数组的使用. 涛哥:c++中的动态数组使用zhuanlan.zhihu.com 指针数组,就指向指针的指针,很早以前在说指针的时候说 ...
- this指针 java_彻底理解Java中this指针
每次看到Java中的this指针,总摸不着头绪.在网上看了很多人的讲解,还是不知道this指针到底是什么东西,今天的的这篇日志可以让你看清this到底是谁.(内容摘自:http://www.mathc ...
- java如何使用指针_如何在Java中使用指针?
Java中的所有对象都是引用,您可以像指针一样使用它们. abstract class Animal {... } class Lion extends Animal {... } class Tig ...
- c语言volatile 结构体,volatile一般用来修饰结构体中的成员变量吗?
保留字肯定就是关键字撒, (1)auto 这个这个关键字用于声明变量的生存期为自动,即将不在任何类.结构.枚举.联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量.这个关键字不怎么多 ...
- 【C 语言】二级指针 内存模型图 ( 指针数组 | 二维数组 | 自定义二级指针内存 )
文章目录 前言 一.指针数组 二.二维数组 三.自定义二维指针内存 前言 绘制如下 333 种二级指针的内存模型 : // I. 指针数组 char *p1 []= {"12", ...
- 对指针的详细认识(一)—— 指针概念+指针类型+野指针+指针运算+二级指针
文章目录 指针是什么? 指针的定义 指针的大小 指针类型 指针有哪些类型? 指针类型有什么意义? 野指针 野指针的成因 如何避免野指针 指针运算 指针+-整数 指针-指针 指针的关系运算 二级指针 指 ...
- C语言:结构体中一级指针和二级指针的创建与释放示例
http://blog.csdn.net/Bixiwen_liu/article/details/53610952 这几天把C语言巩固了一下,作为一门最基本的编程语言,C语言还是相当基础和非常重要的, ...
最新文章
- 全领域涨点 | Evolving Attention在CV与NLP领域全面涨点
- ArcGIS for qml - 地址地标转换为经纬度(地理编码)
- [云炬创业基础笔记]第五章创业机会评估测试1
- MybatisPlus入门案例
- 【LCT】网络(luogu 2173/ZJOI2011)
- openstack neutron(tap、qvb、qvo详解)(转)
- Windows 8 Directx 开发学习笔记(十三)利用模板实现木箱镜像
- html浮窗音乐播放器插件,墨涩网 - WordPress浮窗音乐播放器Floating Window Music Player V3.2.6——墨涩网...
- linux shell 加密shc,使用shc工具加密shell脚本详解
- 纷享销客罗旭对话元气森林黄晓枫:零售数字化的终点不是创新,而是数据
- 为ARM处理器实现Machine Forth
- (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
- 四年级计算机教学总结,四年级信息技术下册教学工作总结范文
- Mybatis错误Illegal overloaded gette
- Java根据日利率计算等额本息每月还款
- 组合排序题目汇总(排列组合、卡特兰数和递归思想)
- 静电耳机与普通动圈或动铁耳机有什么区别
- ArcGIS导出为PDF时汉字乱码,汉字变为方框
- 【原创】如何判断Win10计算机的硬盘是HHD还是SSD
- html语言 日期和星期,日期 时间 星期的html代码是什么代码
热门文章
- 排查软件关闭时访问了0xfeeefeee内存地址导致内存访问违例的崩溃
- CI持续集成系统环境---部署gerrit环境完整记录
- C语言实现有限状态机
- http://www.189qq.cn/soft?54563.htm
- java银器锁,银器保值吗?S925、S990、S999又是什么银……
- linux操作系统基础北京邮电大学出版社,Linux操作系统与实训教程
- 50岁能自学python吗_35岁了零基础自学Python可行吗?
- 第五讲 中断、异常和信号
- 华为入局网约车,已在多个城市测试“ Petal 出行”应用
- 微信网页分享给朋友或朋友圈只有url链接