动态内存开辟(下)

2024-05-08 00:20
文章标签 动态内存 开辟

本文主要是介绍动态内存开辟(下),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言
动态内存开辟以及柔性数组的介绍

一、 几个经典的笔试题

1. 题目一

void Getmemory(char*p)
{p = (char*)malloc(100);
}
int main()
{char* str = NULL;Getmemory(str);strcpy(str, "hello world");printf(str);return 0;
}

这段代码我们可以发现两个很明显的错误

 我们无法对于一个空指针进行strcpy  所以说什么也不会打印 

那么 我们要怎么改变才能将它变成对的代码呢

首先 我们可以将str的地址传递进去 使用二级指针来接收 这样指针就能指向开辟内存的那个位置啦

最后 我们记得要回收内存 避免内存泄漏的情况

大家这里要注意的是二级指针的使用

p是一个二级指针 而我们要改变str的地址 我们需要先对p进行解引用来找到str的地址 然后改变它

*p = (char*)malloc(100);

当然这里还有一种方法可以使这个程序运行

代码表示如下

2. 题目二

这里和题目一又有不一样的地方

因为p数组是在栈区上开辟的 离开函数调用完成就自动销毁了

所以说实际上str现在是一个野指针 这个就是一个错误的代码

3. 题目三

void Getmemory(char**p,int num)
{*p = (char*)malloc(num);
}
void Test()
{char* str = NULL;Getmemory(&str, 100);strcpy(str, "hello");printf(str);}
int main()
{Test();return 0;
}

这个代码是可以完美运行的 但是存在一个内存泄漏的问题 只需要在后面释放一下就可以啦

void Getmemory(char**p,int num)
{*p = (char*)malloc(num);
}
void Test()
{char* str = NULL;Getmemory(&str, 100);strcpy(str, "hello");printf(str);free(str);str = NULL;
}
int main()
{Test();return 0;
}

运行结果如下: 

4.题目四

void Test()
{char* str = (char*)malloc(100);strcpy(str, "hello");free(str);if (str != NULL){strcpy(str, "world");printf(str);}
}
int main()
{Test();return 0;
}

运行结果:

 

这里看似可以完美运行 实际上str是一个野指针 它指向的内存已经被释放了 所以要注意这点

二、 c程序的内存开辟

咱们这里主要主要讨论内存的 栈区 堆区 静态区

三. 柔性数组

C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。

typedef struct st_type
{int i;int a[];//柔性数组成员
}type_a;

3.1 柔性数组的特点

1结构中的柔性数组成员前面必须至少一个其他成员。
2sizeof 返回的这种结构大小不包括柔性数组的内存。
3包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。

特点1就是一个结构性的特点 我们注意一下就好

特点2 我们可以来敲代码实验一下

3.2 柔性数组的使用

struct S
{int n;char arr[];
};
int main()
{struct S* ps = (struct S*)malloc(sizeof(struct S) + 10 * sizeof(char));ps->n = 100;int i = 0;for (i = 0; i < 10; i++){ps->arr[i] = 'Q';}for (i = 0; i < 10; i++){printf("%c ", ps->arr[i]);}return 0;
}

 3.3 柔性数组的优势

上面的两种方式能完成同样的功能 但是方式一 也就是柔性数组有两个好处

1 方便内存释放

相比于下面的代码 只需要释放一次内存就够了

2 有利于提高访问速度

连续的内存有利于提高访问速度

这就是我们将柔性数组单独拿出来讲的原因

以上便是本文所有内容了,如有错误请各位大佬不吝赐教,感谢留言

 

 

这篇关于动态内存开辟(下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968806

相关文章

一道算法题引发的动态内存管理的思考

在做PKU2762时,需要建邻接表。 于是按部就班写了下面一个插入边到邻接表中的函数: const int VMAX = 1010;typedef struct Graph{int vex;Graph* next;}Graph;Graph ArcGraph[VMAX];void insert(int u, int v){Graph* t = new Graph;Graph*

C语言动态内存空间分配(malloc,calloc,realloc,free)

为了代码观感美观,我将代码部分的注释删了 malloc #include<stdio.h>#include<stdlib.h>#include<errno.h>//使用动态内存分配函数的注意事项://1.要判断指针是否为空指针,如果没有成功开辟动态内存空间,则不能继续使用该指针//2.分配的动态内存空间的数量要大于等于赋值的元素的数量,不能造成动态内存的越界访问//3.动态内存空间中

解题--有关动态内存开辟 几道经典的笔试题

文章目录 前言 一、题目一 二、题目二 三、题目三 四、题目四 总结 前言 路漫漫其修远兮,吾将上下而求索。 一、题目一 运行Test 函数会出现什么样的结果? 在Test函数之中,首先创建了一个指针变量 str , 并将其赋值为NULL; 接下来便调用函数GetMemory ,采用传值调用的形式将实参str 的值传给了形参p ,显然在传值调用之

C语言——共用体和动态内存分配

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、共用体是什么?二、动态内存分配   一、共用体是什么? 第三点的细节:以最大的单位成员的长度为标准,而且总大小一定是该标准的整数倍。 eg: 共用体和结构体很类似 二、动态内存分配 掌握malloc就ok了

C++---函数参数的内存开辟

参数类型: 形参:函数名后括号中的变量; 实参:真实传给函数的参数,可以是:常量、变量、表达式、函数等。无论实参是何种类型,调用时,它们必须有确定的值,以便把这些值传送给形参。 调用前: 形参:由于函数没有调用,编译系统没有给函数的形参分配实际内存空间,因此没有实际的参数值。 调用时: 形参:实际调用时,系统会给函数的各形参分配存储空间,同时将实参的值依次传递给各形参,调用结束后,系统

C++学习笔记----6、内存管理(一)---- 使用动态内存(1)

当你使用现代结构,例如std::vector,std::string等等,从一开始到现在以及到未来,C++是一个安全的编程语言。该语言提供了许多的道路,路线以及红绿灯,比如C++核心指导,静态代码分析器来分析代码的正确性,等等。         然而,C++依然允许你出轨。一个出轨的例子就是手动管理内存(分配与释放内存)。对于C++编程这种手动管理内存是一个特别容易出

C语言 动态内存管理 #动态内存函数的介绍 #常见的动态内存错误 #C\C++ 程序的内存开辟 #、柔性数组

文章目录 前言 一、为什么存在动态内存分配 二、动态内存函数的介绍 1、malloc 2、free 3、calloc 4、realloc realloc 的工作原理: 三、常见的动态内存错误 1、对NULL指针的解引用操作 2、对动态开辟空间的越界访问 3、对非动态开辟的空间使用 free 来释放 4、使用 free 释放一块动态开辟空间的一部分 5、对同一块

【C/C++】C++程序设计基础(输入输出、数据类型、动态内存、函数重载、内联函数、常量、引用)

目录 六、C++基础6.1 输入输出6.2 数据类型与表达式6.3 动态内存管理6.4 函数重载6.5 内联函数6.6 常量6.7 引用 六、C++基础 6.1 输入输出 6.2 数据类型与表达式 6.3 动态内存管理 6.4 函数重载 6.5 内联函数 6.6 常量 6.7 引

C语言重难点总结(2)-指针操作与结构体、动态内存

本节学习内容 1.指针操作与结构体 2.函数(递归函数) 3.动态内存 一、指针操作与结构体 指针可以作为结构体的内部成员使用,也可以使用结构体指针操作结构体空间。 二、函数 1.指针函数 (1)什么是指针函数? 指针函数本质是一个函数,该函数的反回值是一个指针。 例如·:int* p(int x,int y); 2.函数指针 函数指针是指向函数的指针。 例如: int a

吴光明铸就鱼跃辉煌,科技创新开辟医疗新篇章

在鱼跃集团的发展历程中,创始人吴光明为其树立了最鲜明的品牌标签——创新。吴光明始终坚信,“研发实力代表一个医疗器械企业的核心竞争力”。他很早就认识到,只有从用户需求出发进行创新,才能提升医疗产品的使用体验,进而打造企业的核心竞争力。 迄今为止,鱼跃集团已在全球范围内建立了12个研发中心和9大生产基地,并多次荣获国家专利金奖、江苏省科技进步奖、江苏省创新发展奖、江苏省医药创新奖、国家技术创