C语言数组长度限制解析及动态分配解决方案

创始人
2024-12-24 23:19:09
0 次浏览
0 评论

数组长度为什么不能是变量?

数组的大小不能用变量来表示,因为在编译和连接时,内存必须根据你指定的长度在数组中分配相应的内存空间。
如果它是一个变量,则无法对其进行赋值。
为了最初解决你可以使用符号常量使用:

#definem100

#definen100然后你在二维中编程u[m][n]可以定义数组,它不一定是100,可以是任何正整数。

在C语言中,所有的变量空间都是在程序运行之初就向系统申请的,包括指针,也需要空间,除了一些动态申请方法如malloc函数之外。
未应用它的空间系统不允许读取和写入。
那么如果将一个数组大小定义为变量,则在运行程序之前无法确定数组大小,并且无法构建应用程序,所以这是不允许的。
解决办法可以改为,如前所述:

inta[n];

int*consta=(int*)malloc(sizeof(int)*n);

int*consta=(int*)malloc(sizeof(int)*n);

这样a变量就可以直接当数组使用了,包含a[1]等。
因为“[]”括号运算符所做的只是偏移其中的地址编号并获取值。
例如:

a[1]

等于

*(a+1)

并且常量修饰符在里面后面的星号,表示指针声后就不能改变,即只能指向接收到的位置,这完全符合数组的性质。

C语言:有n个人围成一圈,按顺序从1到n编号。从第一个人开始报数。

#include

intmain()

{

inti,n,N,out,a[1000];

out=i=n=0;

printf("请输入约瑟夫圆的大小\n100\n");

scanf("%d",&N);

for(i=0;i

{

a[i]=1;

}

i=0;

while(out!=N-1)

{

if(a[i]==1)n++;

if(n==3){a[i]=0;n=0;out++;}

i++;

if(i==N)i=0;

}

for(i=0;i

如果(a[i]==1)printf("最后剩下%d人。
",i+1);break;

return0;

}

扩展信息:

应注意以下几点:

1.一个C语言源程序可能由一个或多个源文件组成。

2.每个源文件可以包含一个或多个函数。

3.一个源程序无论有多少个文件组成,它都只有一个主函数:main函数。
这是整个程序的入口。

4.源程序可以具有预处理指令(包括include指令、ifdef、ifndef指令和定义指令)。
预处理指令通常应放在源文件或源程序之前。

5.所有注释和所有描述都必须以分号结尾。
但是,在预处理命令、函数头和大括号“}”之后不能添加分号。
在结构体、联合体和枚举声明中的“}”后面添加“;”。

6.标识符和关键字必须至少用一个空格分隔。
如果您有明确的分隔符,则不能再添加空格来分隔它。

参考:

百度百科-c语言

c语言define用法举例

C语言中#define的使用方法总结:

1.简单宏定义

#define标识符替换列表(替换列表可以是数字、字符串、标点符号、运算符、标识符、关键字、常量字符注意:替换列表可能为空)。

典型错误:

#defineN=100

inta[N];/*这样就会变成inta[=100],这里会处理相同的标识符*/

#defineN100;

inta[N];/*用分号定义就变成inta[100;],这是一个很常见的错误*/

#definepin(int*);

pina,b;

int*a,b;/*本意是a和b都是int指针,但实际上变成了int*a,b;a是int指针,b是int变量。
这是应该使用typedef而不是定义的地方,这样a和b都是int指针。
*/

2.宏有参数

#define标识符替换列表(x1,x2,x3...xn)(注意:x1,x2,x3...是的,宏参数、它们的标识符和左边之间不能有空格括号)

用法:

(y)?(x):(y))

i=MAX(j+k,m-n);

3.定义一个特殊的单行宏

#defineA(x)T_##x

#defineB(x)#@x

#defineC(x)#x

x=1

替换为:

T_1(T_#符号#x,##是粘性符号,粘在前一个和下一个字符上稍后)

'1'(符号#@x、#@。
宏参数将进行串联量化,并添加符号“”)

"1"(符号#x、#会对宏字符串量词的参数进行量化,并添加一个“”)

4。
多行定义

define可以替代多行代码,在每行换行处添加“\”

#defineMAX(X,Y)do{\

语句1;\

命令2;\

/*如何写注释*/\

}while(0)/*(notrailing;)*/\

热门文章
1
高效掌握:CMD命令轻松启动、关闭及登录... 如何用cmd命令快速启动和关闭mysql数据库服务开发中经常使用MySQL数据库...

2
MySQL分区删除技巧与8.0版本新特性... mysql删除分区在MySQL中,删除分区操作主要使用“可替代”的命令与“ dr...

3
Python代码实现:如何判断三角形的三... python三角形三条边长,判断能否构成三角形Python三角形的三个长边如下:...

4
深度解析:MySQL查询语句执行顺序及优... mysql查询语句执行顺序当这是由于执行SQL的过程时,了解其过程很重要。 ...

5
SQL教程:使用SUBSTRING和IN... sql取特定字符的前面几位字符selectsubstr('L-0FCLDRBCT...

6
MySQL日期差异计算方法:轻松获取日期... MySQL计算时间差两日期相减得月份mysql两时间相减得月MySQL计算时间之...

7
MySQL及SQL查询获取前10条数据方... MySql查询前10条数据sql语句是从MySQL获取前1 0个数据的SQL查询...

8
MySQL启动问题排查与解决指南 Mysql为什么启动不了如果要配置MySQL,则遇到无法启动的问题,可能是由于配...

9
DbVisualizer添加MySQL数... 如何在DbVisualizer中添加本地mysql数据库由于DbVisualiz...

10
SQL字段默认值设置全攻略:轻松实现自动... sql如何设置字段默认值设置SQL中某个字段的默认值;需要遵循几个步骤。首先您需...