一、概述

C语言是不能直接定义动态数组的,数组必须在初始化时确定长度。

如果要在程序运行时才确定数组的长度,就需要在运行的时候,自己去向系统申请一块内存用动态内存分配实现动态数组。

二、动态内存分配函数

1、malloc()函数

void *malloc(unsigned int size)

分配size个字节的内存空间,返回地址的指针,如果内存不够分,就返回空指针NULL。 注意:返回的指针是没有类型的,所以要使用得强制类型转换。

2、calloc()函数

void *calloc(unsigned int num, unsigned int size)

这个也是申请动态内存空间,不过就是分开了而已。 一共申请num个长度为size字节的内存空间。

3、free()函数

void free(void *p)

释放指针p内存空间。

这个很重要!!!!很重要!!!重要!!!

4、realloc()函数

void *realloc(void *p, unsigned int size)

给指针p申请的存储空间改为size个字节,返回的是存储空间首地址(指针)

三、动态数组实现

1、一维动动数组实现

dynamicArrayOneDimensional.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
#include <stdio.h>
#include <stdlib.h> /**************************************************
dynamicArrayOneDimensional.c
输入N个数,求平均数
**************************************************/
main()
{
int *p = NULL, n, i, sum;
printf("Please enter array size:");
scanf("%d", &n); /* 申请地址n个长度为sizeof(int)的连续存储空间 */
p = (int *)malloc(n * sizeof(int)); if(p == NULL)
{
printf("No enough memory!\n");
exit(0);
} printf("Please enter the score:");
for(i = 0; i<n; i++)
{
scanf("%d", p+i);
} sum = 0;
for(i = 0; i<n; i++)
{
sum = sum + *(p + i);
} printf("aver = %d\n", sum/n);
free(p); }

2、二维动态数组的实现

dynamicArrayTwoDimensional.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
#include <stdio.h>
#include <stdlib.h> int findMax(int *p, int m, int n, int *pRow, int *pCol); int main()
{
int *pScore = NULL, i, j, m, n, maxSocre, row, col; printf("Please enter array size m,n:");
scanf("%d, %d", &m, &n); pScore = (int *) calloc(m*n, sizeof(int));
if(pScore == NULL)
{
printf("No enough memory!\n");
exit(0);
} printf("Please enter the score:\n");
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &pScore[i*n+j]);
}
} maxSocre = findMax(pScore, m, n, &row, &col); printf("maxSocre = %d, class = %d, number = %d\n", maxSocre, row+1, col+1); free(pScore); return 0;
} int findMax(int *p, int m, int n, int *pRow, int *pCol)
{
int i, j, max; max = p[0];
*pRow = 0;
*pCol = 0;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
if (p[i*n+j] > max)
{
max = p[i*n+j];
*pRow = i;
*pCol = j;
}
}
} return (max);
}

原文地址:http://yingbing.github.io/blog/2015/01/31/dynamic-array/

代码地址:https://github.com/yingbing/C

C语言 动态数组实现的更多相关文章

  1. c语言 动态数组

    C语言中,在声明数组时,必须明确告诉编译器数组的大小,之后编译器就会在内存中为该数组开辟固定大小的内存.有些时候,用户并不确定需要多大的内存,使用多大的数组,为了保险起见,有的用户采用定义一个大数组的 ...

  2. 线性表之顺序存储结构(C语言动态数组实现)

    线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链 ...

  3. [UE4]C 语言动态数组

    在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定.对于这种问题,用静态数组的办法很难解决.为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数结合指 ...

  4. C语言 · 动态数组的使用

    从键盘读入n个整数,使用动态数组存储所读入的整数,并计算它们的和与平均值分别输出.要求尽可能使用函数实现程序代码.平均值为小数的只保留其整数部分. 样例输入: 5 3 4 0 0 2样例输出:9 1样 ...

  5. (2)redis的基本数据结构是动态数组

    redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; ]; }; 这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针, ...

  6. (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)

    目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...

  7. c语言,动态数组

    试着直接malloc一个2*3*4的空间来模拟数组: #include <stdio.h> #include <malloc.h> int main(void) { int** ...

  8. C语言基础 - 实现动态数组并增加内存管理

    用C语言实现一个动态数组,并对外暴露出对数组的增.删.改.查函数 (可以存储任意类型的元素并实现内存管理) 这里我的编译器就是xcode 分析: 模拟存放 一个 People类 有2个属性 字符串类型 ...

  9. [C] 在 C 语言编程中实现动态数组对象

    对于习惯使用高级语言编程的人来说,使用 C 语言编程最头痛的问题之一就是在使用数组需要事先确定数组长度. C 语言本身不提供动态数组这种数据结构,本文将演示如何在 C 语言编程中实现一种对象来作为动态 ...

随机推荐

  1. Oracle instant client在windows下的安装和使用

    安装 * 从oracle官方网站下载instant client文件,一般来说,有basic.sqlplus.odbc.jdbc,就足够用的了: instantclient-basic-win32-1 ...

  2. Github windows客户端简单上手教程

    作为一个前端,如果不知道GitHub,那你有可能就是一个假前端(O(∩_∩)O哈哈~)开个玩笑...进入正题,咳咳... 1.第一步要在GitHub官网下载最新的客户端,网址是https://desk ...

  3. $.each()遍历json数据

    var json = [ {"id":"1","tagName":"apple"}, {"id":& ...

  4. C++STL笔记

    C++STL 1.vector 向量,长度可变的数组 头文件 #include<vector> 1.1vector的定义 vector<typename> name; 例如: ...

  5. linux文件和目录权限

    linux系统文件和目录的权限说明 文件权限是Linux系统的第一道安全防线,基本的权限有读取(r).写入(w)和执行(x): 文件访问模式 读取:用户能够读取文件信息,查看文件内容. 写入:用户可以 ...

  6. bootstrap select2 参数详解

    Select2使用示例地址: https://select2.github.io/examples.html Select2参数文档说明: https://select2.github.io/opti ...

  7. flume-sink报错 java.lang.IllegalStateException: close() called when transaction is OPEN - you must either commit or rollback first

    1. 确认代码无误(根据情况修改,表示若获得不了数据不会自动commit或者rollback): Event event = channel.take(); if (event == null) { ...

  8. 【转】Mysql分页语句Limit用法

    http://qimo601.iteye.com/blog/1634748 FAQ: MYSQL limit,offset 区别 SELECT keyword FROM `keyword_rank` ...

  9. linux下zookeeper 配置参数

    -----------zookeeper 配置文件 clientPort ---服务的监听端口dataDir ---用于存放内存数据库快照的文件夹,同时用于集群的myid文件也存在这个文件夹里 (注意 ...

  10. 每天一个Linux命令(06)--rmdir命令

    终于忙完了公司的事,可以安静的充充电了. 今天学习一下Linux中命令:rmdir 命令,rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的.(注意,rm -r dir 命 ...