结构体中指针
结构体中带有指针的情况
#include<stdio.h> struct man { char *name; int age; }; int main() { struct man m = {"tom",20}; printf("name = %s, age = %d\n",m.name,m.age); return 0; }
运行结果:
exbot@ubuntu:~/wangqinghe/C/20190714$ gcc struct.c -o struct
exbot@ubuntu:~/wangqinghe/C/20190714$ ./struct
name = tom, age = 20
如果修改m.name的值
#include<stdio.h> #include<string.h> struct man { char *name; int age; }; int main() { struct man m = {"tom",20}; strcpy(m.name,"mike"); printf("name = %s, age = %d\n",m.name,m.age); return 0; }
exbot@ubuntu:~/wangqinghe/C/20190714$ gcc struct.c -o struct
exbot@ubuntu:~/wangqinghe/C/20190714$ ./struct
段错误 (核心已转储)
会出现以上错误。
将指针改位数组:
#include<stdio.h> #include<string.h> struct man { char name[256]; int age; }; int main() { struct man m = {"tom",20}; strcpy(m.name,"mike"); printf("name = %s, age = %d\n",m.name,m.age); return 0; }
编译运行:
exbot@ubuntu:~/wangqinghe/C/20190714$ gcc struct.c -o struct
exbot@ubuntu:~/wangqinghe/C/20190714$ ./struct
name = mike, age = 20
分析:
常量内存中的数值是不能修改的。
#include<stdio.h> #include<string.h> #include<stdlib.h> struct man { char *name; int age; }; int main() { //struct man m = {"tom",20}; struct man m; m.name = malloc(sizeof(char) * 100); m.age = 20; strcpy(m.name,"mike"); printf("name = %s, age = %d\n",m.name,m.age); return 0; }
编译运行:
exbot@ubuntu:~/wangqinghe/C/20190714$ gcc struct.c -o struct
exbot@ubuntu:~/wangqinghe/C/20190714$ ./struct
name = mike, age = 20
#include<stdio.h> #include<string.h> #include<stdlib.h> struct man { char *name; int age; }; int main() { struct man *p = malloc(sizeof(struct man)); p->name = malloc(sizeof(char) * 100); strcpy(p->name,"tom"); p->age = 30; printf("name = %s, age = %d\n",p->name,p->age); free(p->name); free(p); return 0; }
指针在内存的存储方式:
exbot@ubuntu:~/wangqinghe/C/20190714$ gcc struct.c -o struct
exbot@ubuntu:~/wangqinghe/C/20190714$ ./struct
name = tom, age = 30
END
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2018-07-14 1066 Root of AVL Tree (25)