⑴ 怎麼用c語言定義一個無限長的數組
C語言支持定義一個不顯式定義長度的數組,即通過初始化數據來分配數組長度。
比如int a[] = {1,2,3,4,5}; 數組a的長度沒有顯式給出,由於有5個初始化數據,所以分配空間長度為5個int型。
但是無論如何定義,數組的長度都是固定的,在定義的時候就已經分配好空間,從這個角度上C語言無法定義無限長的數組。但很多實際應用中又事先無法確定數組的長度,對於這類情況,一般有兩種方法可以使用。
1 由malloc和realloc兩個函數,分配動態空間,隨時按需改變數組的最大長度。
通過下面例子來理解該方法:
#include<stdio.h>
#include<stdlib.h>
intmain()
{
intsize=100;//最初為100個元素空間。
int*a=NULL;
inti=0;
a=malloc(sizeof(int)*size);
if(a==NULL)return-1;
while(scanf("%d",a+i)==1)//循環向a中輸入數據,直到輸入非數值字元為止
{
i++;
if(i==size)//數組空間不足
{
size*=2;//將數組空間擴大二倍,也可以改用size+=100;之類的操作,使size每次增加固定值。
a=realloc(a,size);//分配新的空間
if(a==NULL)
{
return-1;//這種情況下運行載體(如PC)內存不足以提供,中斷程序。
}
}
}
if(a)free(a);//對申請的內存進行釋放。
return0;
}
從以上程序可以看到,這種方式的原理就是每當數組空間不足時,利用函數realloc分配一段新的內存空間以增大數組長度。 直到占滿所有剩餘空間。
如果到占滿所有空間還是無法存下數據,那麼是硬體無法支持了。
所以這種方法可以做到軟體意義上的無限大數組空間。
但是這種方法代碼量比較大,而且需要頻繁的進行內存的分配,如果實現知道數據的最大可能規模,那麼可以用另一個方法。
2 事先知道數據的最大規模,比如統計一個班的分數時,一個班最多不超過百人,那麼可以直接定義一個長度為100的數組,或者保險起見,定義一個長度為1000的數組,並對其操作。這樣在操作范圍內,這個就是一個「無限長」的數組了。
⑵ C語言變長數組如何實現(接收用戶數據的數組)
你的想法是可以的。
實際上C提供一個標準的庫函數可以實現這個功能。
void *realloc(void *mem_address, unsigned int newsize);
譬如:
int *p = malloc(sizeof(int)*3);
p[0]=0;p[1]=1;p[2]=2;
p = realloc(p, sizeof(int)*4);
這個時候,p指向的前三個int的值還是1、2、3,而且可以對第四個int賦值了。realloc會自動把原來的數據復制到新的內存空間上去。
⑶ C語言,如何定義變長度數組,能記錄輸入的以逗號連接的n個數
int*getMemory(intn){
return(int*)malloc(n*sizeof(int));
}
//.......
int*a=getMemory(10);//得到一個長度為10的int類型的數組(實際上是一段連續的動態內存)
⑷ C語言如何定義一個可變大小的數組
在C語言中,數組的大小是在定義的時候就需要確定的,不然編譯的時候進行分配內存時,會使計算機不知道該分配多少內存單元而報錯。
然而,可以根據定義一個鏈表來達到可變的效果。
鏈表節點定義如下:
struct
{
intdata;//數據域
structnode*next;//指針域
}*node;
structnodehead,p;
head->data=4;
head->next=p;
p->data=5;
類似的可以將一個節點看成是數組中的一個元素,需要增加元素的時候,就增加鏈表的節點就可以了。
⑸ c語言中長度可變的數組
如果一個數組具有動態存儲周期(也就是說,如果在語句塊內定義數組,並且沒有 static 修飾符),那麼 C99 也允許把非常量表達式作為元素數量來定義該數組。這樣的數組被稱為長度可變數組(variable-length array)。
而且,長度可變數組的名稱必須是普通的標識符。長度可變數組不能作為結構或聯合的成員。在下面的示例中,只有 vla 數組的定義是合法的:
void func( int n ){int vla[2*n]; // 合法:存儲周期為動態的static int e[n]; // 非法:長度可變數組不可有靜態存儲周期
struct S { int f[n]; }; // 非法:f不是一個普通標識符/* ... */}
⑹ 如何在C語言中實現可變長度的參數
C語言實現可變長度字元串,主要依靠realloc函數實現,主要代碼如下,
//程序功能,判斷插入字元長度len,若大於預設大小n,調整字元串數組大小,實現動態處理數組大小。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char * pstr = NULL;
int n=10;//字元串初始大小
char str[100];//待插入字元串
int len=0;//待插入字元串長度
pstr = (char*)malloc(sizeof(char)*n);//申請sizeof(char)*n個大小的內存空間
if (pstr==NULL)
{
printf("內存申請出錯,程序退出!\n");
exit(1);
}
⑺ 簡單問題:如何使用c語言中的變長數組
沒辦法定義 」變長數組「
char array[x];
x的值 在定義(分配空間時)必須指明 或者程序能得到x的值。
變長數組 基本實現思路是
申請一塊內存 可存放x個元素 當元素的個數大於x後增加x/n個元素空間(可以使用內存復制)
⑻ C語言 可變長數組
我就不看你的bubble sort的演算法部分了,直接跟你講你不知道錯誤的原因。
你第一種寫法:
int n=1, a[n], i=0, j=0, k=0;
這里你已經定義n = 1, 而a[n]也在該行定義。
那麼編譯器在此就直接給a這個數列分配內存了。
也就是說你a這個數組大小就確定了,即為1。
我不知道你學了內存分配沒有,簡單給你講解一下,
具體你可以在網上搜。
比如一個含有5個整數類型的數組可以這樣定義a[5],
但是也可以這樣獲得:int *a = (int *) malloc ( sizeof( int ) * 5 );
也就是說我們給一個指針分配了內存,從而得到一個數組,
而a[5]這樣定義也是需要編譯器在編譯程序的時候分配內存的
而編譯器會根據你的代碼優化你的程序,並把代碼轉化為匯編再者machine code
說多了,繼續給你分析
你修改過的代碼
int n=1, i=0, j=0, k=0;
printf("請輸入數組長度:");
scanf("%d", &n);
int a[n]; //修改
這個時候由於你在聲明數組之前就已經讀入n了,
所以a這個時候才是根據你輸入的數字所得大小的數組。
這樣你懂我的意思了嗎?