在c语言里数组长度是固定的么(不讨论柔性数组)比如int a[5]={0,1,2,3,4}

如上定义以后,为什么 a[5]=5;这样赋值以后也是可以的,但是用sizeof(a)得到的还是20呢,可以给a[5]赋值这是不是代表它长度可变,,,虽然数组在汇编里就是一个地址然后往后不断偏移偏移,,可是老师讲数组都一再强调数组下标不能越界……往解答一二

8个回答

C语言里面,所谓的长度固定,是因为分配给它的内存只有5个int的空间,
1.你的电脑和编译器上,一个int应该是4个字节,5个不就是20个字节的内存嘛。但是5个元素的数组下标只能到4吧,
a[5]岂不是别人家的内存空间么?
2.数组名a就是一个不可变的指针(a是指针,但是a不能被赋值,比如a++), a永远是数组的首地址(一生一世,永世不移)
但是通过指针方式 *(a+3)这样子是阔以的,因为a+3并没修改a的值啊
3.对于指针,有一种运算符叫[] , []中的数字叫做偏移量,根据类型不同,每次偏移的距离不一样,比如int类型,你的int是32位(4字节),
那么a[0]就是从首地址向后偏移0个字节的内容,也就是首地址的内容
4. a[5]=26; 是指给从a(首地址开始),向后偏移5个int的字节数,如果你的数组定义的时候是5个元素,下标最大是4,a[4]是最后一个
C语言访问a[5]不会报错,但是你随便动用别人家的内存地址,就不怕系统不稳定,系统崩溃么?
这一块内存空间是空闲的算运气好,如果不空闲呢? 最好不要随便动别人家的内存嘛,你申请的内存你可以改,别人家的不要动。

zuoside__lord
zuosidelord 所以这个行为是勉强可以的,但是可能会引发后果可能会修改别的值咯,谢啦 还有真的好像会冒出奇奇怪怪数字呢,
大约一年之前 回复

C语言环境下如下理解:
1. int 不同编译器可能分配不同的字节,一般是分配4个字节
2. int a[5] 申请int型的数据类型,物理地址分配5个int型大小的空间5x4=20 字节. a数组通过指针的方式依次访问对应物理地址中的数值。定义时[5]的意思是5个int型数据,所以对应的可访问序列为:0,1,2,3,4 。超出这个可访问序列(下标),则称为越界
3. a[2] = 5 ,正常在可访问序列内是可被赋值的。意思是下标2处对应的物理地址赋值为5.
4. a[5] = 5 ,可以正常赋值的原因是,编译器可以找到a[5] 对应的物理地址,一般局部变量是在堆上实现地址申请的,因此一般数组是连续的物理地址。所以a[0]..a[4]的物理地址都能访问到,而a[5]也就是a[4]后边的一个int型字长的物理地址,对其做赋值处理自然是没问题的。但该操作不被保护。
5. 越界赋值报错的原因。一般越界地址是不被保护的,因此越界的物理地址极有可能分配给其他的变量来使用,此时就会产生冲突报错甚至程序崩溃等。
6. C语言是可以直接操作物理地址的,所以如上越界赋值是正确的。但当前的编译器会报错,会告诉你这么操作是错误的,会引起内存异常等等问题。

最后:越界是一个伴随每一个c系开发人员的重要问题,所以从已开始养成越界和释放的习惯是很好的。

yanghuatian
yanghuatian 回复zuoside__lord: 笔误,局部变量是在栈上,栈上申请的的地址连续。全局变量在堆上。
大约一年之前 回复
zuoside__lord
zuosidelord 等等,局部变量不是应该是栈上的么,,,,,由于你写得非常条理分明的样子 所以我一个字一个字看 : )
大约一年之前 回复
zuoside__lord
zuosidelord 谢谢 ,你讲得很详细了,我明白了,
大约一年之前 回复

数组长度是固定的。之所以可以a[5]=5是因为,C语言不对下标的合法性(是否越界)做出检查。这么做会造成什么后果(没事,还是会侵犯另一个变量,或者访问违例),是不可预料的。

数组的长度是在定义的时候确定的,不同编译器对于数组越界的处理也是不一样的,一般而言数组的长度是不可以改变的。有一些编译器对于数组越界,
是不处理,继续放后面。但是会对后面的数据进行改变。还有一些编译器就是程序遇到未知错误而终止。但不管是哪一种,都需要注意数组的下标是不是
越界。对于汇编而言数组的定义也是在定义的时候确定,可能对于越界不做处理,但是自己要注意,越界了,会替换其他数据,也会让自己犯迷糊,总不会
想在下标大于数组空间的地方找有用的数据吧。

a[5]=5,这个语句是给数组a的下标为5的元素赋值为5,与数组长度没有关系;
sizeof(a)这个语句,是表示a数据占用字节的长度,如果你的数组类型是int数组,数据中有5个元素,则长度正好20;
如果你的数组类型是char数组,sizeof(a)才是5。

想求数组长度,最好定义一个宏,#define LEN(a) sizeof(a)/sizeof(a[0])

LEN函数就可以求任意数组的长度了。

这个就是c语言的灵活性,a[5]有的时候是可以读出数值的,但是如何a[5]指向的地址是非法地址,那么就会发生错误。正常使用时,千万不要这么使用,建议看一下c语言编程规范。里面会讲不规范编程,可能造成的后果。

ayuan_23 回答较全面了,补充一下,把数组名a理解成指针是可以的,需要注意的是:数组名a编译后是一个常量,对应着机器指令中的立即数,
指针往往是变量,还需要寻址一次的,虽然指针和数组名都可以用*(a+3)和a[3]两种方式访问,但内存寻址方式上还是不同的。

数据大小的确是固定的,原因很简单,因为系统要为数组分配储存空间(只会为数组分配一次),如果不是固定的,就会出现空间容量的悬浮,造成不能存储数据的后果

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
在c语言里数组长度是固定的么(不讨论柔性数组)比如int a[5]=0,1,2,3,4
如上定义以后,为什么 a[5]=5;这样赋值以后也是可以的,但是用sizeof(a)得到的还是20呢,可以给a[5]赋值这是不是代表它长度可变,,,虽然数组在汇编里就是一个地址然后往后不断偏移偏移,,可是老师讲数组都一再强调数组下标不能越界……往解答一二
关于int a[5][5]和int **a
C语言里的rnint a[5][5];rn和int **a; 有什么不一样?rnint a[5][5];rn是等同于rna=(int **)malloc(sizeof(int *)*5);rnfor(int i=0; i<5; i++)rn a[0]=(int *)malloc(sizeof(int)*5);rn还是不等同于,为什么?rn如果不等同于以上,会等同于什么样的代码呢?rnrn
C语言柔性数组
文章目录1 概念2 使用3. 与非柔性数组比较3.1 原来的模型3.2 原来模型使用3.3 对比 1 概念 struct flexible { int len; char data[0];//不计入内存 //or char data[]; }; 结构体中最后一个元素是数组名,不计入内存,即sizeof (struct flexible) = sizeof (int)。 2 使用 typed...
C语言---柔性数组
柔性数组(Flexible Array)也叫伸缩性数组,其实就是变长数组,反映了C语言对精炼代码的极致追求。这种代码结构产生于对动态结构体的需求。比如我们需要在结构体中存放一个动态长度的字符串,这时候,柔性数组可以大显身手了。   C99使用不完整类型来实现柔性数组,标准形式如下:     struct MyStruct     {       int a;
C语言从零开始——柔性数组
####   在结构体内如何存放动态长度字符串?   ####/*        如果需要在结构体里面存放一个动态长度的字符串,我们可以定义一个指针成员,让指针指向字符串动态内存空间        但是这样会造成结构体和字符串分离,操作起来十分麻烦                      还有方法:定义一个结构体指针,将结构体和字符串直接链连接在一起。但是不赞成这样做,因为表达起来很麻烦*/演示
【C语言】—— 柔性数组
一、柔性数组的定义 1、柔性数组的定义 在c99中提到,在一个结构体中,结构体的最后一个元素可以是一个未知大小的数组,这个就叫做柔性数组成员。 2、柔性数组表示 #include&amp;amp;lt;stdio.h&amp;amp;gt; struct S { int a; char arr[];//柔性数组 } //有些编译器支持这样书写柔性...
*((int*)&a)=5 a是对象
分析程序员和黑客的区别rnrn题目:rn  设有如下C++类rnrn class Arnrn int value;rnpublic:rn A(int n = 0) : value(n) rn int GetValue()rn rn return value;rn rn;rnrn  请使用某种方式来在类的外部改变私有成员A::value的值。rnrn rnrn程序员的可能做法:rnrn class Arnrn int value;rnpublic:rn A(int n = 0) : value(n) rn int GetValue()rn rn return value;rn rn void SetValue(int n)rn rn value = n;rn rn;rnrn void f()rnrn rn A a;rn a.SetValue(5);rn rnrn rnrn黑客的可能做法:rnrn void f()rnrn A a;rn *((int *)&a) = 5;rnrn请问*((int*)&a)是强制类型转换吗 我在dev上试了一下 执行过黑客的void f()后a依然是对象 这里是怎么个机制 请教了
定义指针的一个问题比如:int* a; int *a; int * a; 有区别么?
我想大概没区别,为什么没规范呢?
C语言里,这个是标准么?
[code=C/C++]rntypedef struct char str[20]; Str;rnrnStr func()Str ret; return ret;rnrnint main()Str get=func(); return 0;[/code]rnrn这个是拷贝func内的str数组给main里的数组,是深拷贝,这个是C标准么,会由于编译器不同而变化么。rnrn(由于突然想到C++里这种情况都是依赖拷贝构造或者=赋值重载来进行内容的拷贝,但C里却模棱两可)
C语言(柔性数组,零长数组)
可以定义长度为0的数组,这样的数组被称为零长数组或者柔性数组,通常被用在结构体中存放长度可变的数据。   拓展: struct node {     int a;     float f;     char data[0]; }; 在给结构体分配内存的时候,我们会根据需要多分配多一点内存。 struct node *p = malloc(
int a = (5;6;);//????
[code=C/C++]rn int a = (5;6;);//????rn printf("%d\n",a);//???rnrn[/code] rn
C语言求数组长度
我们很苦恼的是,C语言不像JAVA那样把所有的方法都给我们封装好了,我们可以直接拿来用。那么我们该如何求一个未满的数组的长度呢?下面给你一个方法: #include&amp;amp;amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;amp;amp;gt; int lengtha(int a[]){ int n=0; while(a[n]!='\0') n++; //'\0'=&amp;amp;amp;amp;amp;amp;gt;表示的是数组存放元素结束的标志 r
C语言数组长度极限
今天在做《计算机图学实验》大作业的时候,定义了一个数组用于存放顶点坐标,数组长度为1025*1025,可是总是弹出错误,最后经过上网查找,发现错误原因在于我的数组是在函数体内定义的。 函数体内定义的的数组存在于stack,函数体外的或者用static声明的数组存在于data,变量存储的内存空间不同,所以大小限制自然不同。我改为在函数体外定义,果然就正常运行了~
C语言——计算数组长度
C语言中,定义数组之后可以通过sizeof(a)/sizeof(a[0])的方法获得数组长度。 然而,当数组当作参数到子函数中,以上获取数组长度得到的结果永远是1. 因为,a是函数参数,到了本函数中,a只是一个指针(地址,系统在本函数运行时,是不知道a所表示的地址有多大的数据存储空间,这里只是告诉函数:一个数据存储空间首地址),所以,sizoef(a)的结果是指针变量a占内存的大小,一般在32...
C语言数组长度问题
为什么我取N=320的时候可以算,N=3200的时候就不出结果了,N=32000的时候提示十足长度太大,我是c的初学者,请专家指点,我用的编译器是TC2.0的 rn#include rn#include rn#define NUM 3200 rn#define N NUM+7 rn#define dx 2.0/NUM rn#define dt pow(dx,5.0/3.0) rn#define time 1.0 rnrnvoid pos_flux(double arr2[N]) rn rn int ii,jj; rn double ow[3]=0.1,0.6,0.3,array1[N]; rn for(ii=3;iilinfinite) rn linfinite=fabs(v2[j]-pow(sin(M_PI*((j-(N-1)/2)*dx-time)),9)); rn else linfinite=linfinite; rn rn printf("L-infinity-norm is %e,",linfinite); rn rnrnrnvoid main() rn rn int i,j; rn double u[N],u0[N],u1[N],u2[N],temp[N],mesh_ratio,t=0.0; rn for(j=3;jtime) mesh_ratio=(time-t)/(dx)+mesh_ratio; rn flux(temp); rn for(i=0;i
int a:5;
typedef struct AArnrnint a:5; // 这表示这个int 占5 bit吗rnint b:2;rnAA;rnrn这种声明有什么用, 通常用在什么地方.
int a=5;cout<
int a=5;cout<
C语言计算数组长度
看了很多人的经验,在这里简单的总结一下 字符串计算数组长度是strlen(),不要忘记#include&amp;lt;string.h&amp;gt; 和它不带最后一个null就没什么大问题。 sizeof()函数,用来计算()内的对象或者类型所占的内存字节数。用其来计算数组长度的方式很简单,一般用: int a[3] = {1,2,3} int length = sizeof(a)/sizeo...
int a=5; a*=a/a=a++;
int a=5; a*=a/a=a++; 哪位高手 能帮我分解 这个表达式 谢谢了
数组指针 int (*a)[5] 的a,&a和*a ?
int b[5] = 0,1,2,3,4;rnint (*a)[5] = &b;rnrn为什么a,&a和*a的值都是数组b的地址呢?
int a = 5和 int a(5)有什么区别
如题
C语言读取数组长度
sizeof读取数组的内存长度,然后除以第一个数据的内存长度就可以得到数组有几个,例子: #include int main(int argc, const char * argv[]) {     int a[] = {1, 5, 7, 9, 12, 15, 19};     int aCount = sizeof(a) / sizeof(a[0]);
C语言 求数组长度
C语言 数组长度
谁能解释一下 int *a[5] 和 int (*a)[5] 的区别?
[code=C/C++]rnint main(int argc, char* argv[])rnrnrn int *a[5];rn int (*b)[5];rn printf("sizeof(a)=%d,sizeof(b)=%d\n",sizeof(a),sizeof(b));rn printf("sizeof(*a)=%d,sizeof(*b)=%d\n",sizeof(*a),sizeof(*b));rn system("PAUSE");rn return 0;rnrn[/code]rn输出结果:rnsizeof(a)=20,sizeof(b)=4rnsizeof(*a)=4,sizeof(*b)=20rn
int a[5]=0 与 int a[5]=0,的区别
int a[5]=0 是将数组a 5个元素初始化为0rnint a[5]=0, 呢?rnrn关键是不是与编译器相关,还是是C语言的标准?
C 柔性数组
struct Node {    int size;    char data[0];//或者char data[]; }; C99使用不完整类型实现柔性数组成员,在C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组(flexible array)成员(也叫伸缩性数组成员),但结构中的柔性数组成员前面必须至少一个其他成员。柔性数组成员允许结构
c柔性数组
一 , 定义 C99及以上标准支持 标准示例如下: typedef struct st_type { int i; int a[]; }type_a; 初始大小为sizeof(i),0个元素的数组没有占用空间,而后我们可以进行变长操作了。 通过如下表达式给结构体分配内存: type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int))...
int a[5]; and int* b = new int [5];
int a[5];rnint* b = new int [5];rn异同点。rn另,为何sizeof(a)为20,而sizeof(b)为4。
int *a 与int *a=new int[5]有什么区别?
如题
c语言编译 int ** ppa = &(&a); 出错
以下写法可不可以编译通过?请讲述原因。rnint a;rnint ** ppa = &(&a); rn
C语言获得数组长度的函数
1、c语言中,定义数组后可以用sizeof命令获得数组的长度(可容纳元素个数)。 例如: double a[] = {1,2,3,4}; int length; length=sizeof(a)/sizeof(a[0]); //数组占内存总空间,除以单个元素占内存空间大小 printf(“length of a=%d”, length ); //输出length of a=4 2、但...
C语言实现数组长度计算方法
写C时,经常要用到计算数组长度,我一般用下面这种方法: #define LEN(x) sizeof(x) / sizeof(x[0]) 即利用库函数sizeof来计算数组长度,这种方法,对一维数组和多维数组都有效,如以下代码示例: #include &quot;stdio.h&quot; #define LEN(x) sizeof(x) / sizeof(x[0]) int main(int argc,...
const int a与int const a有任何区别么?
在http://dev.csdn.net/author/chaozhiping/55dea5618c3640739ce8979195b5528c.htmlrnrn中我看到了const int a与int const a这两种用法。我现在想问下。这两种用法是一点区别也没有么??如果有的话,是什么?可以给我说说不?
C语言:关于柔性数组,你知道多少?
也许你从来没有听过柔性数组这个概念,但是确实有这个东西,C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做[柔性数组]成员。 例如: typedef struct st_type {     int i;     int a[0];//柔性数组成员 }type_a; 有些编译器会报错无法编译可以改成: typedef struct st_type {     int i;   ...
C语言,int a[5] 数组不能将首地址赋值给 char * p的原因分析
对于这个问题,要考虑两个因素,1. 首地址进行赋值时需要考虑类型相同,点击打开:点击打开链接2. 就是关于指针在运算方面会出现的问题,本着重介绍此点:int a[5] ;int * p1 = a;当执行 p1++时,由于sizeof(int)=4,p1 指向的地址会由首地址往后移动4个字节空间,从a[0] -&amp;gt;a[1]。在假设下列代码可行的基础上:int a[5];char * p2 = a...
如何实现类似于C里的int sort(int a[])的数组排序
请教各位,如何在java中实现类似于C里的int sort(int a[])的数组排序,即在地址(我说不出术语)上改变函数传入的形参的值?谢谢,我刚开始学java,搞不清这个。
C语言如何实现内存池(不固定的)
rnC语言的不固定内存池该如何设计??rnrnrn原理其实都明白,开个大BUF,对其进行内存管理。可是不固定的内存池该如何设计,rn比如:固定的缺点:固定为8,16,24。。。128.若申请5K,看网上讲的是给申请者8K,这是什么原理,是如何操作的。rn我现在想做的是:申请一段内存后,下一次释放它的时候,让它与其他的内存块连接起来,不至于因为内存长短问题而产生内存碎片。
int *a;和int* a
请问int *a;和int* a有什么区别吗
C语言深度解剖笔记2之柔性数组和动态数组
柔性数组是c99引进的,在c99中,结构体的最后一个成员我们允许是未知大小的数组,这个数组我们就叫做柔性数组,而且在这个柔性数组之前必须有至少一个其他成员。sizeof 返回的这种结构大小不包括柔性数组的内存。包含柔性数组成员的结构用 malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构体内存的大小,以适应柔性数组的预期大小。 如下: typedef struct st_typ...
请问(a = b)= c是合法的么?
# include "stdafx.h"rnrnint main(void) rn int a = 0;rn int b = 1;rn int c = 2;rnrn (a = b) = c;rnrn printf("%d\n", a);rnrnrn上面的程序在VC++6.0下通过了,但是宋劲衫老是的一站式linux上说(a = b) = c是不合法的,(a = b)这个表达式不能rn再做左值了,因此放在等号左边是错误的。
相关热词 c# 去空格去转义符 c#用户登录窗体代码 c# 流 c# linux 可视化 c# mvc 返回图片 c# 像素空间 c# 日期 最后一天 c#字典序排序 c# 截屏取色 c#中的哪些属于托管机制