c語言動態內存的問題

不是哈,是釋放那次申請的所有位元組。
malloc向堆內存申請成功指定位元組數時,系統內存管理程序會記錄你這次申請的內存塊大小的,釋放它的時候你只需要提供首地址就行了,它自己知道是多少個位元組。

⑵ C語言中動態內存分配函數的用法及作用(比如malloc,calloc,realloc等)

先舉個例子:某用戶需要一個將任意多個整數按大小排序的程序。(在計算機文件夾中,當文件很多時經常用到排序)
1。若不用動態分配內存,那就定義一個超大的數組吧!問題是,如果用戶不需要那麼大,不就浪費了?如果定義的數組還不夠大,不就不能滿足需求了?
2。如果用動態分配,就解決上述問題了。當你需要多大內存時,就給你多大——如果有的話——這就是動態分配的意義。

現在看上述問題的代碼,我調試過的:
----------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h> /* calloc、exit需要聲明頭文件 */
void main()
{
int n,*p,i,j,m;
printf("本程序可對任意個整數排序;\n");
printf("請輸入整數的總個數: ");
scanf("%d",&n);
p=(int *)calloc(n,sizeof(int)); /* calloc函數的使用 */
if(p==0) {
printf("分配失敗!\n");
exit(1); /* 當分配失敗時,exit可以終止程序 */
}
printf("請輸入這些整數:\n");
for(i=0;i<n;i++)
scanf("%d",p+i); /* 利用指針移位的方法賦值 */
for(i=1;i<n;i++) /* 冒泡排序法 */
{
for(j=0;j<n-i;j++)
if(*(p+j)>*(p+j+1))
{
m=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=m;
}
}
printf("將這些整數從小到大排列輸出為:");
for(i=0;i<n;i++)
{
if(i%5==0) printf("\n"); /* 每隔5個數換行 */
printf(" %11d;",*(p+i));
/* 為了整齊,每個數佔11個字元,當數字很多時這很重要 */
}
printf("\n");
free(p); /* 釋放空間 */
}

----------------------------------------------------------------------
調用calloc函數時,calloc(n,sizeof(int))表示請求n個連續的、每個長度為整型的空間,若成功返回這些空間的首地址。(int *)表示將這個地址放在指針中。到此為止,就可以用指針來對分配到的空間操作了。注意,最後一定要用free函數釋放申請到的空間,否則這部分空間會一直占著。

malloc、calloc、realloc的用法(以上述問題為例)及區別:
1。malloc(n*sizeof(int)) /* 請求n個連續的、每個長度為整型的空間,若成功返回這些空間的首地址,失敗返回0 */
2。calloc(n,sizeof(int)) /* 請求n個連續的、每個長度為整型的空間,若成功返回這些空間的首地址並將每個空間賦值為0,失敗返回0 */
3。realloc(p,sizeof(int)*n) /* 給一個已經分配了地址的指針重新分配空間,參數p為原有的空間地址,sizeof(int)*n是重新申請的地址長度,用於分配不足的時候。個人覺得沒用——不夠就找到原分配處改大一點不就行了?! */

我能說得只有這些了,有些東西看起來麻煩,當你小試一下就會發現,不過如此嘛!學C要多練、多思,不怕麻煩。不知道您學了遞歸沒有?有個經典的「漢諾塔」問題,那傢伙——得整死人啊!到現在我還一知半解的……
希望我的回答對您有幫助!

⑶ c語言中什麼是動態分配內存

c語言用函數malloc動態分配內存的,要用到指針,釋放內存是free指針

malloc 原型:extern void *malloc(unsigned int num_bytes);
用法:#include <malloc.h>
或#include<stdlib.h>
功能:用於向內存申請空間,分配長度為num_bytes位元組的內存塊
說明:如果分配成功則返回指向被分配內存的指針,否則返回空指針NULL。
當內存不再使用時,應使用free()函數將內存塊釋放。
調用格式,
指針名=(指針所指對象的數據類型*)malloc(個數*sizeof(指針所指對象的數據類型)),其對應例子如下:
int *p = (int *) malloc ( n* sizeof(int) );
舉例:
// malloc.c
#include <syslib.h>
#include <malloc.h>
main()
{
char *p;
clrscr(); // clear screen
p=(char *)malloc(100);
if(p)
printf("Memory Allocated at: %x",p);
else
printf("Not Enough Memory!\n");

if(p)
free(p);
getchar();
return 0;
}

⑷ 如何用C語言編寫動態分配內存的函數

#include<stdio.h>

voidmain()
{
int*p;
p=newint;
*p=3;
printf("%d ",*p);
deletep;
}

⑸ C語言動態開辟內存問題

k1=k2=(struct Student *) malloc (sizeof(struct Student)); //第一次輸入
memset(k1,0,sizeof());
裡面有沒有字元數組的東西??先初始化一下吧.
別到時候你賦的時候有個東西沒賦值,也沒初始化,越界了.

另外,你的代碼沒貼全啊.這程序,你看起來是在fwrite的時候出的問題,但是,出問題的時候有可能是在你之前的一些操作導致的,就比如,輸一個學生的名字,char name[15],但你名字輸了20個,越界了,之類的,所以,建議把全代碼貼下.

⑹ C語言動態內存問題

struct example eg[100]; // 使用數組,則已經在內存中分配了空間,就不再需要申請了。如果要動態分配內存,可以這樣:

intn;//保存記錄條數
scanf("%d",&n);
structexample*p=(structexample*)malloc(n*sizeof(structexample));
......
free(p);//釋放動態內存

⑺ c語言什麼時候需要動態分配內存

  1. c語言什麼時候需要動態分配內存?動態分配內存是什麼意思?

    在運行期,無法提前確定內存需要多少時,動態分配內存。

  2. 分配堆的內存,程序冗雜需要釋放那麼有什麼意義?

    釋放多餘的內存,就是把內存歸還給系統管理,防止佔用內存過多,造成系統內存不夠、速度慢甚至崩潰。

  3. 動態分配的參數是表示分配指定大小還是指定不超過該數值大小做到精確?

    動態分配需要指定大小,因為分配內存必須精準。

  4. c語言線程問題?不動態分配有時引用數據類型的值被注銷?不至於吧

    使用局部變數,在超出作用域後變數會失效或者說注銷

⑻ C語言中如何動態增加內存空間

動態增加內存空間 可以用 realloc 函數。函數原型是。
void* realloc (void* ptr, size_t size);
例如,你第一次用 malloc 函數 動態分配了空間,隨著一步步運算,覺得空間不夠,需要加大空間,與此同時,原先空間里的數據需保留並還要繼續使用,這時需要用 realloc,它能滿足此需要。
下面是完整的程序例子。告訴使用 realloc 的竅門。
#include <stdio.h> /* printf, scanf, puts */
#include <stdlib.h> /* realloc, free, exit, NULL */
int main ()
{
int input,n;
int count = 0;
int* numbers = NULL;
int* more_numbers = NULL;
do {
printf ("Enter an integer value (0 to end): ");
scanf ("%d", &input);
count++;
more_numbers = (int*) realloc (numbers, count * sizeof(int));
if (more_numbers!=NULL) {
numbers=more_numbers;
numbers[count-1]=input;
}
else {
free (numbers);
puts ("Error (re)allocating memory");
exit (1);
}
} while (input!=0);
printf ("Numbers entered: ");
for (n=0;n<count;n++) printf ("%d ",numbers[n]);
free (numbers);
return 0;
}