C语言数组长度限制解析及动态分配解决方案
数组长度为什么不能是变量?
数组的大小不能用变量来表示,因为在编译和连接时,内存必须根据你指定的长度在数组中分配相应的内存空间。
如果它是一个变量,则无法对其进行赋值。
为了最初解决你可以使用符号常量使用:
#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人。 return0; } 扩展信息: 应注意以下几点: 1.一个C语言源程序可能由一个或多个源文件组成。 2.每个源文件可以包含一个或多个函数。 3.一个源程序无论有多少个文件组成,它都只有一个主函数:main函数。 4.源程序可以具有预处理指令(包括include指令、ifdef、ifndef指令和定义指令)。 5.所有注释和所有描述都必须以分号结尾。 6.标识符和关键字必须至少用一个空格分隔。 参考: 百度百科-c语言 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变量。 2.宏有参数 #define标识符替换列表(x1,x2,x3...xn)(注意:x1,x2,x3...是的,宏参数、它们的标识符和左边之间不能有空格括号) 用法: i=MAX(j+k,m-n); 3.定义一个特殊的单行宏 #defineA(x)T_##x #defineB(x)#@x #defineC(x)#x x=1 替换为:
",i+1);break;
这是整个程序的入口。
预处理指令通常应放在源文件或源程序之前。
但是,在预处理命令、函数头和大括号“}”之后不能添加分号。
在结构体、联合体和枚举声明中的“}”后面添加“;”。
如果您有明确的分隔符,则不能再添加空格来分隔它。c语言define用法举例
这是应该使用typedef而不是定义的地方,这样a和b都是int指针。
*/
宏参数将进行串联量化,并添加符号“”)"1"(符号#x、#会对宏字符串量词的参数进行量化,并添加一个“”)
4。
多行定义
define可以替代多行代码,在每行换行处添加“\”
#defineMAX(X,Y)do{\
语句1;\
命令2;\
/*如何写注释*/\
}while(0)/*(notrailing;)*/\