釋放數組內存c語言
『壹』 c語言字元數組如何釋放消毀
你提問中定義方式是在函數完成前釋放不了的,你定義的字元數組,放在stack空間,不能用free()試圖釋放堆中的內容,因為那裡是一段程序運行的保證。
只有使用malloc()在棧空間開辟的動態內存才能被釋放!
如果你後面的代碼想繼續用這個數組名的話,這個數組還是可以重新賦值。你可以把你用到的數據獨到這個變數中就行了!
你定義的anto數組在函數完成後,系統自己就回收了!
『貳』 在C語言中,如何釋放動態數組裡面某一個元素所在的內存
刪除就是將其下標所在位置的中的內容置為空(也就是0),然後從此位置開始,後面的內容前移,再把最後那個位置的置為空(就是0)。前移無非就是 類似 arr[i-1]=arr[i]這個意思。當可以確認數組中存放的都是整數,你可以將這個元素置為-1表示刪除。增加就是先檢查你的數組中有沒有-1的元素,如果有,就設置為你的值。如果全部都滿了,就開一個更大的數組,把數據拷貝過去。把相應位後面的一次前移一位,就是實現了刪除操作,可以用個for循環就可以實現了。數組的內存分配:變數在內存中是從大到小定址的(內存中以位元組為單位),比如00000000 00000000 00000000 00001010在內存中,00001010的地址是最小的;而數組則有些不同,數組的元素自然的從上往下排列 存儲,整個數組的地址為首元素的地址。(但是組成元素的位元組還是按從大到小)。
『叄』 C語言二維動態數組怎麼釋放空間
既然是動態數組,那一定不是二維的,因為根本不可能確定維數,只可能是動態的一維數組轉換成二維數組的,如果是這種情況,那轉換回一維的指針然後釋放,當然,如果你說的是指針數組,那麼就應該釋放裡面每一個指針,然後釋放整個數組
『肆』 關於C語言中柔性數組內存釋放問題
首先,結構體里char * cpArr[0];的意思是分配0個為char *元素的數組,其實就是不分配,所以sizeof (struct testStruct)的值是4
然後,sizeof (struct testStruct) + 3 * sizeof (char *)表示的其實就是4個char*指針所佔用的內存空間,也就是4個struct testStruct結構體所佔用的內存空間。
這樣看來,指針t應該指向的是一個有4個struct testStruct元素的結構體,理論上應該不會導致內存泄漏。
這段代碼的大概目的就是打算讓struct testStruct結構體的cpArr數組可以有多個,且個數不確定的元素。雖然編譯器沒有給出警告,但這樣的代碼是一個很不好的代碼——不但降低了可讀性,也降低了可靠性。如果你想建立一個struct testStruct結構體的數組,如果直接使用struct testStruct * t = (struct testStruct *) malloc (2*(sizeof (struct testStruct) + 3 * sizeof (char *)));分配內存,那麼t[1]->cpArr[0]和t[0]->cpArr[1]將代表同一個值。
建議使用
struct testStruct * t = (struct testStruct *) malloc (sizeof (struct testStruct));
t->cpArr=(char**)malloc(3*sizeof(char*));
來分配內存,使用
free (t->cpArr);
free (t);
來釋放內存,char**的意思就是指向char*的指針,為了建立一個char*指針的數組,即字元串數組。而使用時還可以使用t->cpArr[0]、t->cpArr[1]、t->cpArr[2]來表示。即這個程序的代碼可以改成
#include<stdio.h>
#include<stdlib.h>
struct testStruct
{
char * c;
char ** cpArr;
};
int main (void)
{
struct testStruct * t = (struct testStruct *) malloc (sizeof (struct testStruct));
t->cpArr=(char**)malloc(3*sizeof(char*));
t->cpArr[0] = "This";
t->cpArr[1] = "is a";
t->cpArr[2] = "test.";
printf ("%s %s %s\n", t->cpArr[0], t->cpArr[1], t->cpArr[2]);
free (t->cpArr);
free (t);
return 0;
}
這樣雖然多佔了一個char**指針的空間,但會大大增強程序的可讀性和可靠性,就不會有問題了。
『伍』 C語言數組指針內存釋放
//用指針的指針當二維數組請參考以下代碼
#include<stdio.h>
#include<stdlib.h>
intmain(){
int**b;
b=(int**)malloc(sizeof(int*)*4);//二維數組b有4行
for(inti=0;i<4;i++)//替每行分配存儲空間
b[i]=(int*)malloc(sizeof(int)*3);//二維數組b每行3列
for(inti=0;i<4;++i)for(intj=0;j<3;j++)
b[i][j]=i*j;
for(inti=0;i<4;++i){
for(intj=0;j<3;j++)
printf("%5d",b[i][j]);
printf(" ");
}
for(inti=0;i<4;i++)
free(b[i]);//釋放每行的存儲空間
free(b);//釋放b
return0;
}
『陸』 在C語言中如何實現字元串數組的內存釋放,以防新值和舊值部分「重疊」,導致出亂碼,敬請指教。
#include<stdio.h>
int main()
{
int i,j,k;
char str[30];
do
{
gets(str);
if(strcmp(str,"exit")==0) break;//看到你的程序沒有結束,我自已幫你加了一句.當輸入為exit時,退出
for(i=0;i<30;i++)
{
if((str[i]==' ')||(str[i]=='\0'))
{
for(k=i-1;(str[k]!=' ')&&(k>=0);k--)
printf("%c",str[k]);
printf(" ");
}
}
printf("\n");
memset(str,0xffff,30);//將str指向的位置往後的30位元組全部置255.
//本來是寫的memset(str,0,30)的(即清零,0即是'\0'),但分析了你的程序, 只能用前一種.你試試.
}while(1);
return 0;
}