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()函式釋放 如果要求行列都是動態的話,最簡單的辦法就是這樣,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 ... 北問邇 1.就算沒有free main 結束後也是會自動釋放malloc 的記憶體的,這裡監控者是作業系統,設計嚴謹的作業系統會登記每一塊給每一個應用程式分配的記憶體,這使得它能夠在應用程式本身失控的情況下仍然做到有效地 記憶體。你可以試一下在taskmanager裡強行結束你的程式,這樣顯然是沒有... xxiao文 如果程式還在執行記憶體開闢的東西不會丟失,重啟之後你沒執行程式當然記憶體的東西會自動消失難道還累加啊 那你那程式豈不是比病毒還可怕,這些寫程式很基本的不釋放記憶體的程式不是好程式. new之後不delete,被分配的記憶體不會永遠丟失,而是一直被佔用。系統重啟,被分配的記憶體別說使用,...關於c語言動態分配二維陣列的問題
C語言動態分配記憶體為什麼總是提示警告?可以執行
c 程式設計中,用new動態分配記憶體後,不使用delete,被分配的記憶體會永遠丟失嗎