- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C语言 动态内存分配的详解及实例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1. 动态内存分配的意义 。
(1)C 语言中的一切操作都是基于内存的.
(2)变量和数组都是内存的别名.
①内存分配由编译器在编译期间决定 。
②定义数组的时候必须指定数组长度 。
③数组长度是在编译期就必须确定的 。
(3)但是程序运行的过程中,可能需要使用一些额外的内存空间 。
2. malloc 和 free 函数 。
(1)malloc 和 free 用于执行动态内存分配的释放 。
(2)malloc 所分配的是一块连续的内存 。
(3)malloc 以字节为单位,并且返回值不带任何的类型信息:void* malloc(size_t size),
(4)free 用于将动态内存归还系统:void free(void* pointer),
(5)_msize(void* pointer)可以获取 malloc 出来的内存空间大小 。
3. 使用 malloc 和 free 需要注意的地方 。
(1)malloc 和 free 是库函数,而不是系统调用 。
(2)malloc 实际分配的内存可能有会比请求的多,但不能依赖于不同平台下的 malloc 行为.
(3)当请求的动态内存无法满足时,malloc 返回 NULL 。
(4)当 free 的参数为 NULL 时,函数直接返回 。
malloc(0)返回什么?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <stdio.h>
#include <malloc.h>
int
main()
{
int
i=10;
int
* p= NULL;
for
(i=0;i<100;i++)
{
//注意,malloc(0)会返回一个有效的内存地址,大小为1
//但我们不能依赖编译器的这种行为来使用这个字节的空间!
p = (
int
*)
malloc
(i);
printf
(
"%d "
,_msize(p));
//返回malloc出来的内存空间大小
free
(p);
}
return
0;
}
|
内存泄漏检测模块 。
mleak.h 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#ifndef _MLEAK_H_
#define _MLEAK_H_
#include <stdio.h>
#include <malloc.h>
#define MALLOC(n) mallocEx(n, __FILE__, __LINE__)
#define FREE(p) freeEx(p)
void
* mallocEx(
size_t
n,
const
char
* file,
const
line);
void
freeEx(
void
* p);
void
PRINT_LEAK_INFO();
#endif
|
mleak.c 。
复制代码 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
#include "mleak.h"
#define SIZE 256
//动态内存申请参数结构体
typedef
struct
{
void
* pointer;
//申请到的内存地址
int
size;
//内存块大小
const
char
* file;
//文件名
int
line;
//文件行号
}MItem;
static
MItem g_record[SIZE];
//记录每个动态内存申请的操作
void
* mallocEx(
size_t
n,
const
char
* file,
const
line)
{
int
i = 0;
void
* ret =
malloc
(n);
//动态内存申请
if
(ret != NULL)
{
//申请成功,则记录下来
//遍历全局数组,记录此次操作
for
(i = 0; i< SIZE; i++)
{
//查找位置
if
(g_record[i].pointer == NULL)
{
g_record[i].pointer = ret;
g_record[i].size = n;
g_record[i].file = file;
g_record[i].line = line;
break
;
}
}
}
return
ret;
}
void
freeEx(
void
* p)
{
if
(p != NULL)
{
int
i = 0;
//遍历全局数组,释放内存空间,并清除操作记录
for
(i = 0; i< SIZE; i++)
{
if
(g_record[i].pointer == p)
{
g_record[i].pointer = NULL;
g_record[i].size = 0;
g_record[i].file = NULL;
g_record[i].line = 0;
free
(p);
break
;
}
}
}
}
void
PRINT_LEAK_INFO()
{
int
i = 0;
printf
(
"Potenital Memory Leak Info:\n"
);
//遍历全局数组,打印未释放的空间的申请记录
for
(i = 0; i< SIZE; i++)
{
//查找位置
if
(g_record[i].pointer != NULL)
{
printf
(
"Address:%p, size:%d, Location:%s:%d\n"
,
g_record[i].pointer,
g_record[i].size,
g_record[i].file,
g_record[i].line);
}
}
}
|
testc. 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#include <stdio.h>
#include "mleak.h"
void
f()
{
//没释放,会造成内存泄漏!
MALLOC(100);
}
int
main()
{
int
* p = (
int
*)MALLOC(3 *
sizeof
(
int
));
f();
p[0] = 1;
p[1] = 2;
p[2] = 3;
FREE(p);
PRINT_LEAK_INFO();
return
0;
}
/*
输出结果:
E:\Study>gcc test.c mleak.c
E:\Study>a.exe
Potenital Memory Leak Info:
Address:00602ED8, size:100, Location:38-1.c:7
*/
|
4. calloc 和 realloc 函数 。
(1)malloc 的同胞兄弟
void* calloc(size_t num, size_t size),
void* realloc(void* pointer,size_t new_size),
(2)calloc 参数表示要返回 num 个某种类型(如 sizeof(int))大小的内存空间。calloc 能以类型大小为单位申请内存并初始化为 0. 。
(3)realloc 用于修改一个原先己经分配的内存块大小。当第一个参数 pointer 为 NUL 时,等价于 malloc.
calloc 和 realloc 的使用 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#include <stdio.h>
#include <malloc.h>
#define SIZE
5
int
main()
{
int
i =
0
;
int
* pI = (
int
*)malloc(SIZE * sizeof(
int
));
//malloc内存没有初始化
short
* pS = (
short
*)calloc(SIZE, sizeof(
short
));
//内存初始化为0
for
(i =
0
; i < SIZE;i++)
{
printf(
"pI[%d] = %d, pS[%d] = %d\n"
, i, pI[i], i, pS[i]);
}
printf(
"Before: pI = %p\n"
, pI);
//重置内存大小之前的pI指针
pI = (
int
*)realloc(pI,
2
* SIZE * sizeof(
int
));
//内存未初始化的
printf(
"After: pI = %p\n"
, pI);
for
(i =
0
; i <
10
;i++)
{
printf(
"pI[%d] = %d\n"
, i, pI[i]);
}
free(pI);
free(pS);
return
0
;
}
|
通过此文希望大家对C语言的动态内存分配了解掌握,谢谢大家对本站的支持! 。
最后此篇关于C语言 动态内存分配的详解及实例的文章就讲到这里了,如果你想了解更多关于C语言 动态内存分配的详解及实例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个应用程序,它会抛出 GKSession 并在各种条件下(连接超时、 session 失败等)创建一个新的 GKSession。不过,我遇到了内存泄漏问题,并且有时会在重新连接几次循环后崩溃。
比如我在宿主代码中有一个浮点指针 float *p 是否可以确定他指向的内存类型(设备/主机)? 最佳答案 在 UVA system 中, 运行时 API 函数 cudaPointerGetAttri
我已将项目转换为 .Net 4.0 并且以下代码不起作用: typeof(RuntimeTypeHandle).GetMethod("Allocate", BindingFlags.Instance
当我声明 char ch = 'ab' 时,ch 只包含 'b',为什么它不存储 'a'? #include int main() { char ch = 'ab'; printf("%c"
我对 Disk Sector 和 Block 有疑问。扇区是一个单位,通常为 512 字节或 1k、2k、4k 等取决于硬件。文件系统 block 大小是一组扇区大小。 假设我正在存储一个 5KB 的
假设我有 8 个人和5000 个苹果。 我想将所有苹果分发给所有 8 个人,这样我就没有苹果了。 但每个人都应该得到不同数量 将它们全部分发出去的最佳方式是什么? 我是这样开始的: let peopl
我正在构建的网站顶部有一个搜索栏。与 Trello 或 Gmail 类似,我希望当用户按下“/”键时,他们的焦点就会转到该搜索框。 我的 JavaScript 看起来像这样: document.onk
我有一小段代码: if (PZ_APP.dom.isAnyDomElement($textInputs)){ $textInputs.on("focus", function(){
我观察到以下行为。 接受了两个属性变量。 @property (nonatomic, retain) NSString *stringOne; @property (nonatomic, assign
我正在解决这样的问题 - 实现一个计算由以下内容组成的表达式的函数以下操作数:“(”、“)”、“+”、“-”、“*”、“/”。中的每个数字表达式可能很大(与由字符串表示的一样大)1000 位)。 “/
我有一组主机和一组任务。 每个主机都有 cpu、mem 和任务容量,每个任务都有 cpu、mem 要求。 每个主机都属于一个延迟类别,并且可以与具有特定延迟值的其他主机通信。 每个任务可能需要以等于或
该程序的作用:从文件中读取一个包含 nrRows 行和 nrColomns 列的矩阵(二维数组)。矩阵的所有元素都是 [0,100) 之间的整数。程序必须重新排列矩阵内的所有元素,使每个元素等于其所在
世界!我有个问题。今天我尝试创建一个代码,它可以找到加泰罗尼亚语号码。但是在我的程序中可以是长数字。我找到了分子和分母。但我不能分割长数字!此外,只有标准库必须在此程序中使用。请帮帮我。这是我的代码
我确定我遗漏了一些明显的东西,但我想在 Objective C 中创建一个 NSInteger 指针的实例。 -(NSInteger*) getIntegerPointer{ NSInteger
这个问题在这里已经有了答案: Difference between self.ivar and ivar? (4 个答案) 关闭 9 年前。
我如何将 v[i] 分配给一系列整数(v 的类型是 vector )而无需最初填充 最佳答案 你的意思是将 std::vector 初始化为一系列整数? int i[] = {1, 2, 3, 4,
我想寻求分配方面的帮助....我把这个作业带到了学校......我必须编写程序来加载一个 G 矩阵和第二个 G 矩阵,并搜索第二个 G 矩阵以获取存在数第一个 G 矩阵的......但是,当我尝试运行
我必须管理资源。它基本上是一个唯一的编号,用于标识交换机中的第 2 层连接。可以有 16k 个这样的连接,因此每次用户希望配置连接时,他/她都需要分配一个唯一索引。同样,当用户希望删除连接时,资源(号
是否有任何通用的命名约定来区分已分配和未分配的字符串?我正在寻找的是希望类似于 us/s 来自 Making Wrong Code Look Wrong ,但我宁愿使用常见的东西也不愿自己动手。 最佳
我需要读取一个 .txt 文件并将文件中的每个单词分配到一个结构中,该结构从结构 vector 指向。我将在下面更好地解释。 感谢您的帮助。 我的程序只分配文件的第一个字... 我知道问题出在函数 i
我是一名优秀的程序员,十分优秀!