关于如何输入一个数来任意确定数组大小

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于如何输入一个数来任意确定数组大小相关的知识,希望对你有一定的参考价值。

以c语言程序设计第四版谭浩强著P143说明部分为理论依据
以下是程序,为什么显示错误?
#include<stdio.h>
fun(int x)

int a[x], i,j;
for(i=0;i<x;i++)
scanf("%d",&a[i]);
for(j=0;j<x;j++)
printf("%d\t",a[j]);

void main()

int k;
scanf("%d",&k);
fun(k);


Compiling...
a.c
c:\users\administrator\desktop\a.c(4) : error C2057: expected constant expression
c:\users\administrator\desktop\a.c(4) : error C2466: cannot allocate an array of constant size 0
c:\users\administrator\desktop\a.c(4) : error C2133: 'a' : unknown size
执行 cl.exe 时出错.

一般数组的定义是不能用变量来作为维数的,
如:int a[n]是不行的;
数组的维数要用常量表达式定义,此常量表达式之恩那个包含整型字面值常量和枚举常量或用常量表达式初始化的const对象,非const变量以及要运行阶段才知道其值得const变量都不能用于定义数组的维数。
要满足你所说的用户输入数组大小的要求,就要用动态数组。
用整型变量来举个例子如下:
C++中用下面定义:
int n;
std::cin >> n;
int *a = new int[n];
C语言中可以用malloc:
int n;
scanf("%d", &n);
int *a = (int*)malloc(n * sizeof(int));

要追加一点说明就是动态数组是存储在堆上的,用完了一定要释放内存,否则会造成内存泄露。
释放内存的时候,malloc申请的内存free来释放,new申请的内存用delete释放。
举个单纯用C语言基础知识说明的例子
void maim ()

int a[100],i,n;
scanf("%d",&n);
for(i=0;i<=n;i++)
scanf("%d",&a[i]);
printf("%d\n",a[i]);

注意n<=100
参考技术A 数组在编译前的长度应该是确定的
若不确定
只能用动态内存分配
把int a[x]改成
int *a;
a=(int*)malloc(x*sizeof(int));
谭浩强的书虽名扬天下,但那只是针对初学者的
书上各种错追问

我也感觉是这样,尤其是在数组和指针这一块,看的时候产生了很多问题,又不知道该怎么解决,但是我也是才接触了一学期,老师讲到指针就结课了,每个星期就一节讲解大课,一节上机课,都是大体讲了一下,但是我又想把书中的东西都搞清楚,有没有什么很适合我这种人看的书啊,推荐一下,谢谢了!

追答

《C语言深度剖析》 很有深度的,我估计初学者是看不懂的
另外,如果你想把所有细节都弄懂,你最好去学下汇编(如果你是计算机专业,我劝你最好学一下,软件工程的话,学不学无所谓了)

本回答被提问者采纳

c关于数组所占内存大小问题

如果定义数组char a[1000];
在进行输入时cin>>a;
比如只输入了3个元素,再加上'\0',那其他996个字节岂不是浪费了?
有没有办法输入多少个元素占用的内存就是多少?不会造成内存浪费
小弟初学者,有很多地方不懂,谢谢各位了!!!

在C++中可以用string类保存字符串。

在C中,可以通过malloc()和realloc()配合动态分配存储空间,例如:

//---------------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>

char *getline(void) /*读取一个以回车结尾的字符串,保存在动态分配的空间中,并返回这个字符数组的首地址*/

char b,*a=NULL;
int ln=0;
while ((b=getchar())!='\n')

a=(char *)(a?realloc(a,sizeof(char)*(ln+1)):malloc(sizeof(char)));
a[ln++]=b;

if (a)
a=(char *)realloc(a,sizeof(char)*(ln+1));
a[ln]='\0';

return a;

int main(void)

char *str;

printf("%s",str=getline());

free(str); /*由于str指向的空间是动态分配的,所以要用free()函数将其释放*/
return 0;

//---------------------------------------------------------------------------
参考技术A 1.使用动态数组

cin>>n
char *str=new char(n);
然后str就可以使用了 str 的大小由n来决定
使用完后要记得delete

2.其实只要定义为局部变量 其实基本上是不影响程序内存大小的
而且这点数据量完全可以忽略不计~
参考技术B 用来存放字符量的数组称为字符数组。
字符数组类型说明的形式与数值数组相同。例如:
char
c[10];
由于字符型和整型通用,也可以定义为int
c[10]但这时每个数组元素占2个字节的内存单元。字符数组也可以是二维或多维数组,例如:
char
c[5][10];即为二维字符数组。
字符数组也允许在类型说明时作初始化赋值。例如:
static
char
c[10]=`c`,`
`,`p`,`r`,o`,g`,r`,`a`,`m`;赋值后各元素的值为:
数组c
c[0]c[1]c[2]c[3]c[4]c
[5]c[6]c[7]c[8]c[9]其中c[9]未赋值,由系统自动赋予0值。
当对全体元素赋初值时也可以省去长度说明。例如:
static
char
c[]=`c`,`
`,`p`,`r`,`o`,`g`,`r`,`a`,`m`;这时c数组的长度自动定为9。
用字符串方式赋值比用字符逐个赋值要多占一个字节,
用于存放字符串结束标志'\0'。

以上是关于关于如何输入一个数来任意确定数组大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Matlab/Octave `mexFunction`(不是 nrhs)中确定数组的大小

C语言如何定义一个N行N列的二维数组任意输入数据

C++ 如何创建一个需要输入大小的数组

java中怎么直接根据用户的输入来确定数组的大小

关于任意输入结束的问题(转)

C语言中如何定义一个二维数组,数组长度由输入值确定?