C语言有关数组的几点
动态大小数组
先来看一段代码:
int n = 3;
int a[n];
int i;
for(i=0;i<n;i++)
{
a[i]=i;
printf("%d\n",a[i]);
}
我在声明数组a时,使用了一个变量n,这看起来似乎有问题,但是实际上C99中支持这种用法,gcc也支持这种用法,可以正常编译运行。这种用法实现了动态大小数组(运行时动态,一旦确定不再改变)。
另外,如果一个数组的大小需要根据某一输入N的大小来确定,那该怎么办呢?
#include <stdio.h>
#include <stdlib.h> void main()
{
int n;
int *a;
int i;
scanf("%d",&n);
a = (int*)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
{
a[i]=i;
printf("%d\n",a[i]);
}
return;
}
上面这段代码中,数组a的大小依赖输入n,因此先将a声明为一个指针,在确定n的大小之后,使用malloc来为a分配内存。注意:上面代码中我没有free掉这段内存,实际使用中malloc之后应该在不使用这段内存时free!
0长数组
最近几次看到类似这样的结构体:
typedef struct
{
int a;
int b[0];
}A;
看到没,长度为0的数组!!!当然,这种奇怪的用法只在GNU C中合法,在很多很多GNU开源代码中都用到过这种用法。
那么,为啥要设置一个0长的数组呢?为啥不声明一个指针:int *b?
首先,来看看int *b时的情况。这种情况下,我们在分配内存时,必须分配两次;在释放内存时也必须显示为b释放一次,这样太麻烦。如果使用b[0],有哪些好处呢?我们可能使用下面的语句来分配内存:
A *cc = (A *)malloc(sizeof(A)+len);
因为0长数组b不占内存,因此我们可以通过变量len来把握分配内存的大小,进而实现长度可变的结构体。使用0长数组可以分配一段连续的内存,在释放时直接使用free(cc)一次性释放掉所有内存,简化了内存管理。但是,0长数组只能在结构体末尾。
C语言有关数组的几点的更多相关文章
- 【算法】C语言实现数组的动态分配
C语言实现数组的动态分配 作者:白宁超 2016年10月27日20:13:13 摘要:数据结构和算法对于编程的意义不言而喻,具有指导意义的.无论从事算法优化方向研究,还是大数据处理,亦或者网站开发AP ...
- C语言一维数组、二维数组、结构体的初始化
C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...
- go语言的 数组、slice、map使用(转)
golang群 点击加入 go语言的 数组.slice.map使用, 由于网上有很好的说明, 不需要再写了,请看这几篇: Go语言中的 Array, Slice和 Map 深入学习golang五篇,以 ...
- go语言 类型:数组
在go语言中数组array是一组特定长度的有序的元素集合. go的数组类型由两部分组成——类型和长度,二者缺一不可.数组本来就是一块存储相同类型元素的连续内存空间,因此决定一个数组的类型,必然需要决定 ...
- C语言基础--数组及相关
概念: 一堆相同类型的数据的有序集合 格式: 元素类型 数组名称[ 元素个数 ] 定义数组: // 定义了一个名称叫做scores的数组, 数组中可以存放3个int类型的数据 ]; // 只要定义一 ...
- 学习C语言的数组
C语言的数组 数组声明的实例:int num[3];只要记下这个模板就好. 不建议使用变量定义数组,如果使用了变量定义数组,作为数组的元素的个数,不初始化的情况下是随机值,如果初始化会直接报错 注意: ...
- 对于C语言中数组名是指针的理解
我们都知道,c语言中数组名是一个指针,比如下面这段代码 #include<iostream>using namespace std;int main(){ int a[4]={1,2,3, ...
- c语言中数组相关问题
c语言中数组相关问题: 1.数组基本定义: 相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标.组成数组 ...
- 线性表之顺序存储结构(C语言动态数组实现)
线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链 ...
- C语言入门(16)——C语言的数组
和结构体类似,数组也是一种复合数据类型,它由一系列相同类型的元素组成.C语言支持一维数组和多维数组.如果一个数组的所有元素都不是数组,那么该数组称为一维数组. 一维数组的定义方式 在C语言中使用数组必 ...
随机推荐
- python日志输出
import logging logger = logging.getLogger() #生成一个日志对象,()内为日志对象的名字,可以不带,名字不给定就是root,一般给定名字,否则会把其他的日志输 ...
- World’s Smallest h.264 Encoder
转载 http://www.cardinalpeak.com/blog/worlds-smallest-h-264-encoder/ View from the Peak World’s Smalle ...
- ProtoBuffer 简单例子
最近学了一下protobuf,写了一个简单的例子,如下: person.proto文件 message Person{ required string name = 1; required int32 ...
- Android程序的安全系统【转】
最近在移植Android过程中遇到了Android程序(apk)权限的问题.最近也对这方面进行了一些了解,在此和大家分享. Android框架是基于Linux内核构建,所以Android安全系统也是基 ...
- C语言break语句
break语句不能用于循环语句和switch语句之外的任何其他语句中: breakh中断switch break如果用于循环,是用来终止循环:break如果用于switch,则是用于终止switch. ...
- C#的dll被其他程序调用时,获取此dll正确的物理路径
当C# dll被其他程序调用时,用Application.StartupPath获取的dll路径并不一定是此dll的物理路径,有可能是调用程序的路径. 以下方法或者能够获取dll正确的物理路径(未经过 ...
- Ubuntu12.04 使用中遇到的问题
这个随笔回记录使用Ubuntu遇到的一些问题 不定期进行整理和分类 1.Question: ubuntu 无法检测包或者源码包 Description:Ubuntu软件中心打开时报错 无法检 ...
- 音频视频播放(jquery中将jquery方法转化成js方法)
在jQuery中没有音频视频直接播放的方法,我们在写音频视频时,应该将jquery的方法转化为js方法:play():pause() 补充: 将jq对象转化成js对象写法: var music=$ ...
- 判断sqlserver临时表等临时资源是否存在
if exists(select * from tempdb..sysobjects where id=object_id('tempdb..#TEMP')) drop table #TEMP
- Linux 安装oracle10g 配置dataguard 介绍和步骤
DataGuard是甲骨文推出的一种高可用性数据库方案,在Oracle 8i之前被称为Standby Database.从Oracle 9i开始,正式更名为Data Guard.它是在 ...