ANSI/ISO C之前,对数组的一次性初始化必须要求数组被声明为静态的,楼上说static和extern与变量的使用范围有关,没错,但不是这里要使用的含义,这里静态(全局变量默认为静态的)指的是该变量只初始化一次。全局变量肯定是只初始化一次的,所以这主要是针对函数块里面声明的变量来说的,就是说在函数块里面声明的静态局部变量,只在第一次进入这个函数块的时候才进行初始化。ANSI/ISO C允许对声明的非静态数组也进行一次性初始化。所以在支持ANSI/ISO C标准的编译环境下,函数块内写
static int a[3] = { 2, 4, 5 };
和
int a[3] = { 2, 4, 5 };
都对。
函数块外面写static时才是楼上所说的变量的适用范围,不加static声明出来的变量的范围可以在文件之间,加了static声明的变量则只在该文件内。但此时,你加不加static都不会影响你写int a[3] = { 2, 4, 5 };因为这个时候a是全局变量,默认的是静态的,这样的初始化当然没有问题的。
另外,这种一次性初始化必须在定义一个变量的时候才是允许的。这一点,楼主要谨记,不管是ANSI/ISO C还是C99都是不允许出现
int a[3];
a[3] = { 2, 4 , 5 }
的,不管有没有static修饰。如果你不想在定义的时候初始化,那就只有等到你需要的时候通过赋值操作来进行,数组当然得通过循环
② 什么是静态数组有什么作用请具体介绍。
静态数组 static 与 “动态”auto 的区别在于 编译器为两者分配的内存不一致 static型会一直存在于内存中 而AUTO型的只有在调用编译器才给分配内存 所以当定义一个局部变量数组是 只有static型的才能初始化。不过ANIC c标准好像auto也能初始化了
③ c语言外部与局部数组
我想说,你自己已经找到问题的关键了,却好像倒在了最后一步...
你为什么要打印printf("\n%d,%d",i,j);这句话呢?难道你不正想要看看i和j是什么值吗?
来看看我机器上你的程序运行结果:
1. 当a是全局变量时,程序跑到一半报错,这时候i,j都远远大于6和8这两个值。
2. 当a是main函数的局部变量时,程序比之前出错的更快。最后时刻的i,j的值分别为6,8
很明显,你的程序写错了,使得你想好只有6行8列的数组最后需要访问到第7行第9列这样越界的地方。如果你像我一样看到了以上的结果,那么你显然不应该认为(1)是对的,因为你可以看到i,j下标越界,只不过程序没有抛错,这个的原因可能是c++编译器对待函数局部栈上的数据,和对待全局变量的不同。但是你不能将你的程序的正确性依赖于编译器对待数组越界的处理策略。
④ c语言中,分配的静态数组,如何释放内存
全局数组在程序运行结束时自动释放。
函数内定义的数组在函数退出时自动释放。
C/C++没有提供人为释放办法。
⑤ c语言结构数组,如何创建外部数组和静态数组
外部变量就是引用外部文件的变量(非静态)
静态变量与全局变量相似,区别是静态变量只能在定义的函数内被调用。
静态变量与局部变量区别:静态变量不会自动释放,函数调用结束后,值依然保留。静态变量定义时赋初值,只有一次,多次调用函数,不会反复赋初值。如果没有初值,静态变量也会自动赋初值。
关于数组定义在栈中维度大小受限,想要定义在堆中,可以用malloc申请。
详细看我写的案例备注吧。
//externFile.c文件
#include<stdio.h>
structbook2
{
intid;
};
structbook3
{
intid;
};
structbook2bk2;
staticstructbook3bk3;//b3是静态全局变量,无法通过extern被外部调用
⑥ C语言,请问 如果一个函数中我定义一个局部static字符数组,如果我不停的调用这个函数。
static静态变量分配在全局变量(静态变量)区内,这是在编译环节中就会确定的。
如果在程序的一个函数中定义一个局部static字符数组的话,那么这个static字符数组的生存期是整个程序运行时期,即在一个程序运行周期内,它使用的都是同一块地址而且是同一个物理地址。
程序结束后,自动释放。
⑦ c语言数组的定义
C语言支持一维数组和多维数组。如果一个数组的所有元素都不是数组,那么该数组称为一维数组。
在C语言中使用数组必须先进行定义,一维数组的定义方式为:类型说明符; 数组名 ;[常量表达式]。
其中,类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符,方括号中的常量表达式表示数据元素的个数,也称为数组的长度。例如:
int a[10]; /* 说明整型数组a,有10个元素 */
float b[10], c[20]; /* 说明实型数组b,有10个元素,实型数组c,有20个元素 */
char ch[20]; /* 说明字符数组ch,有20个元素 */
对于数组类型说明应注意以下几点:
1、数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。
2、数组名的书写规则应符合标识符的书写规定。
3、数组名不能与其它变量名相同。例如:
int a;
float a[10];
是错误的。
4、方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素。但是其下标从0开始计算。因此5个元素分别为a[0], a[1], a[2], a[3], a[4]。
5、不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。例如:
#define FD 5
// ...
int a[3+2],b[7+FD];
是合法的。但是下述说明方式是错误的。
int n=5;
int a[n];
6、允许在同一个类型说明中,说明多个数组和多个变量。例如:
int a,b,c,d,k1[10],k2[20];
(7)c语言局部静态数组扩展阅读:
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。[1]目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
⑧ C语言静态数组
通俗的说静态数组就是在定义数组的时候,由操作系统分配的空间,比如
int
a[10];
这就是在定义时由系统给你分配了10个int类型的空间,这个空间是可以初始化的,比如
int
a[10]
=
{1,
2,
3,
4,
5,
6,
7,
8,
9,
10};
那么在这个定义之后,系统会首先分配10个int类型的存储空间,然后把大括号里面的数字分别的,按顺序放到这10个空间里。你所做的只是写这么一句,而数组赋值的操作就由系统完成了。当然,初始化与否看你的需求,初始化不是强制性操作,想初始化就初始化,不想也没问题,还是上面的例子继续:
int
a[10];
这里定义了,但是没初始化,这没有任何问题,以后你可以自己往里面赋值,比如
a[1]
=
8;
a[5]
=
3;
或者
for(int
i
=
0;
i
<
10;
i++)
a[i]
=
i;
等等
对于动态数组,不能被初始化,因为动态数组在定义时只是个指针,比如
int
*a;
这里变量a只是个指向int类型的指针,而不是数组。动态分配有10个int类型元素的数组,如下:
a
=
(int)
malloc(10*sizeof(int));
很明显,指针a在定义的时候不能被初始化,比如这样写就是错误的:
int
*a
=
{1,2,3,4,5,6,7,8,9,10};
/*
错误!
*/
因为a是只有4个字节的指针,没有可用的存储空间给需要初始化的变量。
所以,静态数组从语法上来说允许被初始化。作为程序员来说,你可以初始化静态数组,也可以不初始化,由你决定。
⑨ C语言——局部静态变量的问题
其实是这样的。静态变量在内存中存储的位置,与全局变量是同一个区域。
所以,在编译期间,它的存储和大小就已经确定了,也就是已经分配了空间了。
而在c语言中,“分配内存”往往看做是变量被定义的一个标志。
所以,你在运行程序的时候,由于静态变量已经分配过内存了,不会再次进行分配了,它的定义语句就不会再次被执行了。
⑩ C语言中静态数组与动态数组
c是一个int指针变量,这个变量保存了一个地址,c+i也是一个int指针,和c相比偏移了i个int大小(一般4或8字节)
c[i]是c+i处的int变量,等价于*(c+i)
数组的名字就是数组的名字,