C語言為陣列動態分配記憶體並賦值,為什麼第一種方法正確,第二種方法錯誤

時間 2022-03-05 04:50:26

1樓:來自杏花村大氣的木星

一般來說,記憶體需要用多少,就開闢多少,如果你非要用迴圈的方式不斷的增加記憶體大小,建議你用以下方法:

關鍵是用到函式realloc,這個函式的作用,網上很多,可以去查查。主要是用來在原有記憶體空間的基礎上,增加記憶體空間大小的。

#include

#include

void main()

for(i=0;i

printf("%d ",a[i]);}

2樓:匿名使用者

只分析錯的:編譯時不會報錯,但是邏輯上有問題,達不到目的,malloc()函式是在堆疊中分配的記憶體,即使在for迴圈中你也不能確定它是按順序給你分配的空間,而且for迴圈每一次執行的時候,你都給出了a陣列的首地址,所以只有for迴圈最後一次分配的才是你得到的最終的a的首地址,當然,你分配的空間只能裝一個整數,i>0之後就出界了,即使編譯器不進行邊界檢測不報錯,你會發現結果只有陣列最後一個輸出才正確,前面n-1個都是隨機數,而之前n-1次分配的空間由於沒有記錄地址,都丟失了,只有程式結束後才會被系統**。

提醒一下,自己動態分配的空間要自己釋放(free)。

3樓:

a=(int *)malloc(sizeof(int));  //這個返回的東西只能放一個 int。 多次malloc 返回的地址是不保證連續的,每次的返回都只能容納一個int。

a[i]=i;    訪問後面的第i個元素,但後面其實是沒有東西的,非法訪問來的。  如下圖,紅色的表示沒有實際的東西,非法訪問

4樓:

建議你試試:

a+i=(int *)malloc(sizeof(int)); //這種方法錯誤

a[i]=i;

上面的 方法我自己試了 一下,不好使!

發現:多個malloc生成的記憶體塊是不一定連續的,因此,不能當做陣列對待,

因為陣列最大的特點是:可以用a+i表示第i個元素,而你這種方法分配的記憶體有可能不是不連續的

5樓:眼眶的溼潤

malloc()的引數是長度

如果你直接輸入a=(int *)malloc(n*4);也是正確的關鍵在於你前一種方法開闢了n個4,也就是n個整型變數所需要的空間而後一種只開了一個4,如果你存進陣列的整型變數超過1個,那麼便會超出開闢的空間的範圍

從而發生錯誤,動態開闢記憶體就是需要多少開多少,少了也是不行的。

補充一下:sizeof(int)得到的是int的大小,也就是4個位元組。

6樓:匿名使用者

sizeof(int)得到的是int的大小,也就是4個位元組。如果你要分配n個int變數,需要申請n個4位元組。

c語言程式設計問題。動態分配記憶體,陣列。 如何把動態分配記憶體模擬為二維陣列,如果是之前好像calloc

7樓:

#define n 10

int* s;

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

//此時s就是陣列,訪問時用s[0]....s[n-1]二維陣列稍微麻煩一點

int x,y; //x行 y列

printf("請輸入二維陣列的大小: ");

scanf("%d,%d",&x,&y);

int **s;

s=(int**)malloc(sizeof(int*)*x);

int i;

for(i=0;i

//訪問時用 s[0][0].....s[x-1][y-1]

c語言陣列的問題

8樓:小海鬼

在c語言裡有字元陣列的說法,我想問的是那有沒有字串陣列這個說法呢?

答:c語言因為沒有字串型別(c++裡有),所以c語言處理字串的時候,需要把字串中的字元存到一個陣列裡頭,藉助陣列這個工具來對字串進行一系列的處理。那麼怎末標識一個字串呢,記住,字串必須是以空字元結尾的。

空字元是'\0'。有的時候也可以用ch==null?來判斷一個字元是不是空字元。

為什麼要用空字元結尾? 因為一些處理字串的工具函式要依賴這個結尾才來正確識別字串,才能為進一步的處理做準備。這些字串處理函式就是你列出的:

strcat函式(字串連線函式),strcpy函式(字串複製函式)。具體他們是什麼作用,我想你去看書本會得到易懂而且更詳細的答案。推薦(21天學會c語言 這本書)

附:如果在c裡頭要跟字串陣列能搭上邊的,就是宣告一個二維陣列,二維陣列的每一維都是一個一維字元陣列。那麼這個二維陣列就可以充當「字串陣列」的功能了。

如:int ch[2][20]=,};

另外,藉助字元陣列來處理字串,是一種,還有一種是通過動態分配記憶體在處理字串。

定義一個字元陣列:char c1=,我對這個陣列賦值,對嗎?

這裡的5對嗎?如果是6呢?

答:你是對這個字元陣列賦值,準確的說你是在定義一個陣列並對她初始化。這裡的5不對,應該是6,因為字串必須得是以空字元結尾,當然你也可以不用,但基本上沒人回這麼做。

因為這麼做了,你就無法使用處理字串的工具函式了。

在c語言裡有很多字元處理函式,如strcat函式(字串連線函式),strcpy函式(字串複製函式),……我想問c語言裡規定這些函式有什麼作用啊?

答:答一里頭說了,這裡就不重複了。

問:字元'\0'和字元『 』有什麼區別啊?(第二個字元是個空格字元)

答:首先他們都是一個字元,區別是:一個是空字元,一個是空格字元,它們在ascii碼是不一樣的,是兩個完全不同的字元。

空字元是空白字元的一種,屬於特殊字元。enter,tab 都屬於空白字元。

9樓:泣鑲卉

不對,應該寫成:

char c1="china",得留一個'\0'的位置,如果非得用5,那就這樣char c1=,

'\0'是指ascii為0值的字元,也就是不存在的字元,而' '是字元空格,其ascii是32。

10樓:

有字串陣列這一說法.

char c1=,錯的,

應該是char c1[6]="china",或者是 char c1[5]=, 因為字串有一個結束符,在分配內在的時候會自動載入,所以china這是五個字元,要再加一個結束符'\0'.

strcat函式(字串連線函式),strcpy函式(字串複製函式)

這是為了方便程式設計師編寫特定的程式.

'\0'是字串結束符,''是空字元,也就是說程式在遇到'\0'時會結束,但是在碰到''時不會,除非有特別的規定或者是特別語句.

從ascii上有這樣的區別:'\0'是指ascii為0值的字元,也就是不存在的字元,而' '是字元空格,其ascii是32

11樓:我欲弒神

你對陣列宣告是錯誤的

陣列宣告是這樣的char c1[6]=;這裡為什麼要用6呢。。因為還有個/0字元佔一個位置。還有那個大括號可以不要。。但是寫上也沒有錯誤。。

strcat函式是連線函式就是把2個字串連線成一個字串。。

而strcpy是複製函式。。

使用方法是這樣的。。

strcat(字串1或者指標1這個目標也是他,被拷貝字元2或者指標2);

strcpy(目標字元陣列,被複制字串。)這些函式方便了文書處理。。

問:字元'\0'和字元『 』有什麼區別啊?(他們都是一個字元。區別在於。前面的'/0'可以做字串結尾的標誌。而' '不能

12樓:匿名使用者

有字串陣列這個說法

首先這個賦值應該是這樣:char c1 = "china";

至於那些字串處理函式是方便使用者呼叫的,實際上這些函式我們自己也可以寫

但是不用白不用,我們自己就不用去寫了

'\0'是一個字串結束的標誌,而空格本身就是個字元。

c語言裡面怎麼給一個用malloc申請了動態空間的陣列賦值

13樓:匿名使用者

比如說 int p;

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

那麼p就相當於陣列p[n]的基地址了,所以對它賦值只要用陣列的寫法:

p[i]=x;

就可以了

14樓:就在愛丁堡

for 迴圈,一個個賦值。或者用setmem做統一初始化

15樓:hellow小清

#include

#include

main()

,一個簡單的例子,

求c語言大神指教動態的給陣列賦值的問題!高分~

16樓:年降水量就

一定要存在data[0]裡面嗎看

可以迴圈賦值

void set(int data[50], int new_value)

也可以整體複製

void set(int data[50], int new_value)

效率更高的是用一個變數儲存當前的位置,也就是新的不存在data[0]裡面,而是動態改變

int index = 0;

void set(int data[50], int new_value)

讀取的時候把data[index]當做data[0]

任君選擇

關於c語言動態記憶體分配的問題

17樓:那郎榮碧白

要實現動態記憶體的分配,除了利用含指標成員的結構體之外,還需利用c語言提供的幾個標準庫函式。(使用時應包含標頭檔案「alloc.h」或「malloc.h」或「stdlib.h」)

1.malloc函式

函式原型為void

*malloc(unsigned

intsize);在記憶體的動態儲存區中分配一塊長度為"size"

位元組的連續區域。函式的返回值為該區域的首地址。

「型別說明符」表示把該區域用於何種資料型別。(型別說明符*)表示把返回值強制轉換為該型別指標。「size」是一個無符號數。例如:

pc=(char

*)malloc

(100);

表示分配100個位元組的記憶體空間,並強制轉換為字元陣列型別,函式的返回值為指向該字元陣列的指標,

把該指標賦予指標變數pc。若size超出可用空間,則返回空指標值null。

2.calloc

函式函式原型為void

*calloc(unsigned

intnum,

unsigned

intsize)

按所給資料個數和每個資料所佔位元組數開闢儲存空間。其中num為資料個數,size為每個資料所佔位元組數,故開闢的總位元組數為

num*size。函式返回該儲存區的起始地址。calloc函式與malloc

函式的區別僅在於一次可以分配n塊區域。例如:

ps=(struct

stu*)

calloc(2,sizeof

(struct

stu));

其中的sizeof(struct

stu)是求stu的結構長度。因此該語句的意思是:按stu的長度分配2塊連續區域,強制轉換為stu型別,並把其首地址賦予指標變數ps。

3.realloc函式:

函式原型為void

*realloc(void

*ptr,

unsigned

intsize)

重新定義所開闢記憶體空間的大小。其中ptr所指的記憶體空間是用前述函式已開闢的,size為新的空間大小,其值可比原來大或小。函式返回新儲存區的起始地

址(該地址可能與以前的地址不同)。例如p1=(float

*)realloc(p1,16);將原先開闢的8個位元組調整為16個位元組。

**動態申請的記憶體空間要進行手動用free()函式釋放

關於c語言動態分配二維陣列的問題

如果要求行列都是動態的話,最簡單的辦法就是這樣,n行m列 int p int malloc sizeof int n for int i 0 i n i p i int malloc sizeof int m 然後就可以這樣傳遞 void f int p f p 不過用完了還要一個一個的去free ...

C語言動態分配記憶體為什麼總是提示警告?可以執行

北問邇 1.就算沒有free main 結束後也是會自動釋放malloc 的記憶體的,這裡監控者是作業系統,設計嚴謹的作業系統會登記每一塊給每一個應用程式分配的記憶體,這使得它能夠在應用程式本身失控的情況下仍然做到有效地 記憶體。你可以試一下在taskmanager裡強行結束你的程式,這樣顯然是沒有...

c 程式設計中,用new動態分配記憶體後,不使用delete,被分配的記憶體會永遠丟失嗎

xxiao文 如果程式還在執行記憶體開闢的東西不會丟失,重啟之後你沒執行程式當然記憶體的東西會自動消失難道還累加啊 那你那程式豈不是比病毒還可怕,這些寫程式很基本的不釋放記憶體的程式不是好程式. new之後不delete,被分配的記憶體不會永遠丟失,而是一直被佔用。系統重啟,被分配的記憶體別說使用,...