本人声明了一个结构体包含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语言给结构体指针申请空间,结构体中的指针变量申请空间问题相关推荐

  1. php this指针的用法,C#_C#中this指针的用法示例,本文实例展示了C#中this指针的 - phpStudy...

    C#中this指针的用法示例 本文实例展示了C#中this指针的用法,对于初学者进一步牢固掌握C#有很大帮助,具体内容如下: 一.this指针是什么: 这里有一些面向对象编程的概念需要说明:类(Cla ...

  2. java int 指针_如何在Java中使用指针?

    小编典典 Java中的所有对象都是引用,你可以像使用指针一样使用它们. abstract class Animal {... } class Lion extends Animal {... } cl ...

  3. 共享内存中使用指针_详解c++中字符指针数组的使用

    之前有写过一篇叫c++中动态数组的使用,今来看看c++中的字符指针数组的使用. 涛哥:c++中的动态数组使用​zhuanlan.zhihu.com 指针数组,就指向指针的指针,很早以前在说指针的时候说 ...

  4. this指针 java_彻底理解Java中this指针

    每次看到Java中的this指针,总摸不着头绪.在网上看了很多人的讲解,还是不知道this指针到底是什么东西,今天的的这篇日志可以让你看清this到底是谁.(内容摘自:http://www.mathc ...

  5. java如何使用指针_如何在Java中使用指针?

    Java中的所有对象都是引用,您可以像指针一样使用它们. abstract class Animal {... } class Lion extends Animal {... } class Tig ...

  6. c语言volatile 结构体,volatile一般用来修饰结构体中的成员变量吗?

    保留字肯定就是关键字撒, (1)auto 这个这个关键字用于声明变量的生存期为自动,即将不在任何类.结构.枚举.联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量.这个关键字不怎么多 ...

  7. 【C 语言】二级指针 内存模型图 ( 指针数组 | 二维数组 | 自定义二级指针内存 )

    文章目录 前言 一.指针数组 二.二维数组 三.自定义二维指针内存 前言 绘制如下 333 种二级指针的内存模型 : // I. 指针数组 char *p1 []= {"12", ...

  8. 对指针的详细认识(一)—— 指针概念+指针类型+野指针+指针运算+二级指针

    文章目录 指针是什么? 指针的定义 指针的大小 指针类型 指针有哪些类型? 指针类型有什么意义? 野指针 野指针的成因 如何避免野指针 指针运算 指针+-整数 指针-指针 指针的关系运算 二级指针 指 ...

  9. C语言:结构体中一级指针和二级指针的创建与释放示例

    http://blog.csdn.net/Bixiwen_liu/article/details/53610952 这几天把C语言巩固了一下,作为一门最基本的编程语言,C语言还是相当基础和非常重要的, ...

最新文章

  1. 全领域涨点 | Evolving Attention在CV与NLP领域全面涨点
  2. ArcGIS for qml - 地址地标转换为经纬度(地理编码)
  3. [云炬创业基础笔记]第五章创业机会评估测试1
  4. MybatisPlus入门案例
  5. 【LCT】网络(luogu 2173/ZJOI2011)
  6. openstack neutron(tap、qvb、qvo详解)(转)
  7. Windows 8 Directx 开发学习笔记(十三)利用模板实现木箱镜像
  8. html浮窗音乐播放器插件,墨涩网 - WordPress浮窗音乐播放器Floating Window Music Player V3.2.6——墨涩网...
  9. linux shell 加密shc,使用shc工具加密shell脚本详解
  10. 纷享销客罗旭对话元气森林黄晓枫:零售数字化的终点不是创新,而是数据
  11. 为ARM处理器实现Machine Forth
  12. (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  13. 四年级计算机教学总结,四年级信息技术下册教学工作总结范文
  14. Mybatis错误Illegal overloaded gette
  15. Java根据日利率计算等额本息每月还款
  16. 组合排序题目汇总(排列组合、卡特兰数和递归思想)
  17. 静电耳机与普通动圈或动铁耳机有什么区别
  18. ArcGIS导出为PDF时汉字乱码,汉字变为方框
  19. 【原创】如何判断Win10计算机的硬盘是HHD还是SSD
  20. html语言 日期和星期,日期 时间 星期的html代码是什么代码

热门文章

  1. 排查软件关闭时访问了0xfeeefeee内存地址导致内存访问违例的崩溃
  2. CI持续集成系统环境---部署gerrit环境完整记录
  3. C语言实现有限状态机
  4. http://www.189qq.cn/soft?54563.htm
  5. java银器锁,银器保值吗?S925、S990、S999又是什么银……
  6. linux操作系统基础北京邮电大学出版社,Linux操作系统与实训教程
  7. 50岁能自学python吗_35岁了零基础自学Python可行吗?
  8. 第五讲 中断、异常和信号
  9. 华为入局网约车,已在多个城市测试“ Petal 出行”应用
  10. 微信网页分享给朋友或朋友圈只有url链接