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
SQL2000数据库备份压缩技巧:优化空... 怎么将SQL2000中的较大的备份数据库压缩变小更改数据库属性-选项-恢复模型很...

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

3
SQL字符串处理技巧:单引号使用与转义标... SQL语句中,字符串类型的值均使用什么符号标明?单引号如果字符串内有单引号,请小...

4
Windows环境下Redis安装指南与... redis安装windowsredis基本简介与安装安装Redis首先需要获取安...

5
深度解析:Redis性能优势与局限性,助... redis有哪些优缺点?Redis的全称是RemoteDictionary.Se...

6
深入解析:MySQL数据库的特性与应用 mysql是什么MySQL是一个关系数据库管理系统。MySQL是一个开源关系数据...

7
MySQL日志类型全解析:二进制、错误与... MySQL的三种日志类型详解mysql三种日志类型MySQL日志的三种类型,详解...

8
Redis基础入门:详解Key-Valu... 如何读取redis中的key值中的结果首先需要连接redis客户端redis-c...

9
C语言编程必备:99乘法表经典代码解析 c语言必背代码有哪些?1.输出表达式/*9*9。总共9行9列,其中i控制行,j控...

10
MySQL数据列不显示问题解决方案指南 如何在MySQL中快速解决数据表中某列数据不显示的问题mysql不显示某列数据如...