网站建设丿金手指下拉,vps wordpress域名,平面设计网站模板,企业级网络管理#x1f436;博主主页#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️#x1f525;专栏系列#xff1a;线性代数#xff0c;C初学者入门训练#xff0c;题解C#xff0c;C的使用文章#xff0c;「初学」C #x1f525;座右铭#xff1a;“不要等到什么都没有了#xff0c;才下… 博主主页ᰔᩚ. 一怀明月ꦿ ❤️专栏系列线性代数C初学者入门训练题解CC的使用文章「初学」C 座右铭“不要等到什么都没有了才下定决心去做” 大家觉不错的话就恳求大家点点关注点点小爱心指点指点 目录 内存分布 realloc
柔性数组柔性数组又名0长度数组 内存分布 内核空间 用户不能读写 栈区 函数的形参以及局部变量 内存映射段 文件映射动态库匿名映射 堆区 动态开辟的内存malloccallocrealloc 静态区 全局变量 静态变量 代码段 可执行代码/只读常量存放函数体的二进制代码 realloc realloc用于原空间不足继续开辟更大的空间引用头文件为#includestdlib.h realloc的原型 void* realloc (void* ptr, size_t size); void* ptr原空间的首地址 size_t size开辟新空间的大小 注如果ptr为空指针时则他的作用和malloc相同例如 #includestdio.h
#includestdlib.h
int main()
{int *ptr(int *)realloc(NULL,20);//这里就相当于malloc开辟了20个字节例如//int* ptr(int*)malloc(20);for(int i0;i5;i){printf(%d ,ptr[i]);}return 0;
}柔性数组柔性数组又名0长度数组 柔性数组的特点 1结构中的柔性数组成员前面必须至少有一个其他成员。 这样创建的柔性数组是正确的 struct student
{int n;int arr[];//或者int arr[0]
}; 这样创建是绝对不允许的 struct student
{int arr[]//如果是柔性数组前面应该还有其他类型的成员
}; 2sizeof返回的这种结构大小不包括柔性数组的内存 3包含柔性数组成员的结构用malloc函数进行内存的动态分配并且分配的内存应该大于结构体的大小以适应柔性数组的预期大小 #includestdio.h
#includestdlib.h
#includeerrno.h
#includestring.h
typedef struct student
{int n;//0-3char c;//4//8//int arr[0];int arr[];//这里没有指定大小这就是柔性数组
}student;
int main()
{//2printf(%d\n,(int)sizeof(student));//结果是8//3student* ptr(student*)malloc(sizeof(student)10*sizeof(int));if(ptrNULL){printf(%s\n,strerror(errno));//打印申请失败的原因return 1;}//使用ptr-n100;ptr-cw;for(int i0;i10;i){ptr-arr[i]i;}for(int i0;i10;i){printf(%d ,ptr-arr[i]);}//利用realloc函数调整arr数组的大小student* str(student*)realloc(ptr,sizeof(student)20*sizeof(int));if(strNULL){printf(%s\n,strerror(errno));//打印申请失败的原因return 1;}else{ptrstr;}//释放free(ptr);return 0;
} 结构体指针方案不使用柔性数组达到柔性数组的目的 指针方案一 #includestdio.h
#includestdlib.h
#includeerrno.h
#includestring.h
typedef struct class
{int n;char c;int* arr;
}class;
int main()
{class* ptr(class*)malloc(sizeof(class));int* str(int*)malloc(sizeof(int)*10);if(strNULL){printf(%s\n,strerror(errno));//如果分配失败打印错误信息return 1;}else{ptr-arrstr;}//用realloc调整arr的大小str(int*)realloc(ptr-arr,20*sizeof(int));if(strNULL){printf(%s\n,strerror(errno));return 1;}else{ptr-arrstr;}//释放free(ptr-arr);free(ptr);
}指针方案二 #includestdio.h
#includestdlib.h
#includeerrno.h
#includestring.h
typedef struct class
{int n;char c;int* arr;
}class;
int main()
{class ptr;//创建了一个结构体对象int* str(int*)malloc(sizeof(int)*10);if(strNULL){printf(%s\n,strerror(errno));return 1;}else{ptr.arrstr;}//调整arr的大小str(int*)realloc(ptr.arr,20*sizeof(int));if(strNULL){printf(%s\n,strerror(errno));return 1;}else{ptr.arrstr;}//释放free(ptr.arr);return 0;
}总结对比两种方法柔性数组和结构体指针不难发现柔性数组更加简便可以整理出柔性数组有两大优势 1动态开辟的内存比较容易释放 使用柔性数组只需要调用用一次free函数进行释放而使用结构体指针方案一则需要两次调用free函数进行释放这样会导致忘记释放了从而出现内存泄漏的问题使程序更容易出错。 2程序的运行速度更快 柔性数组只动态开辟了一块空间而结构体指针这种方法开辟两块空间。结构体指针这种方法内存碎片比较多程序访问速度有所下降。 如果大家还有不懂或者建议都可以发在评论区我们共同探讨共同学习共同进步。谢谢大家