是否可以釋放()非動態記憶體?
我有一個長度為 10 的 char 陣列。我有 4 個不需要的零。有沒有辦法修剪最后四個零并縮短陣列大小?或者是將值復制到縮短陣列的唯一方法
char arr[10]={2,8,2,1,7,1,0,0,0,0}
//NON WORKING CODE! just showing the concept
//The shortArr function dosen't work because i have to pre-declare the size
char * shortArr(char * arr){
unsigned long len = strlen(arr);
static char shortArr[len]; //<--- Variable length array declaration cannot have 'static' storage duration
memcpy(shortArr, arr, len);
return &shortArr;
};
shortArr();
基本上我在做什么
unsigned char arr[10]={2,8,2,1,7,1,0,0,0,0}
unsigned char shortArr[strlen(arr)];
/*creating a size of 6 by removing the las 0,0,0,0 ,
all do it is quite dangerous to use with strlen since it stops at the first encountering with a zero
what if the arr had a zero in between the first 7 bytes
arr[10]={2,8,0,1,7,1,0,0,0,0} then only (2,8) would be kept and
and the size would be of 2
*/
memcpy(copyOfArr,arr,sizeof(shortArr)); // copying the bytes from arr to shortArr
uj5u.com熱心網友回復:
您可以定義一個函式來幫助計算預期陣列的新長度。這個函式基本上會計算等于的尾隨位元組數'\0'。
unsigned trimmedlen (unsigned char arr[], unsigned arrlen) {
unsigned newlen = arrlen;
for (i = 0; i < arrlen; i) {
if (arr[arrlen - i - 1] != '\0') break;
--newlen;
}
return newlen;
}
現在,您可以使用 VLA 創建新陣列(假設您的編譯器支持它)。
unsigned char newarr[trimmedlen(arr, sizeof(arr))];
memcpy(newarr, arr, sizeof(newarr));
uj5u.com熱心網友回復:
是否可以釋放()非動態記憶體?
您不應將未由malloc或相關例程回傳的地址傳遞給free. 的行為free在 C 2018 7.22.3.3 中指定。第 2 段說:
該
free函式使 所指向的空間ptr被釋放,也就是說,可用于進一步分配。如果ptr是空指標,則不執行任何操作。否則,如果引數與記憶體管理函式先前回傳的指標不匹配,或者如果空間已通過呼叫freeor被釋放realloc,則行為未定義。
uj5u.com熱心網友回復:
如果你知道你希望你的陣列有多短,那么你可以簡單地這樣做:
#define ELEM_COUNT 20
char arr[ELEM_COUNT];
#undef ELEM_COUNT
#define ELEM_COUNT 10 //just ignore that in reality, arr has 20 elements
如果您在運行時不知道它,那么只需將其存盤為運行時值。簡單的!
//with VLAs
size_t size = 20;
char arr[size];
size = 10;
同樣,只需忽略其他元素存在的事實。大多數時候,您都在回圈訪問陣列:
for (size_t i = 0; i < size; i ) {
printf("%c\n", arr[i]);
}
因此,要減少陣列,您所要做的就是減少size變數。這不會浪費記憶體,因為數量太少了。如果浪費了 10 個位元組,什么都不會發生。如果它是一個大陣列,不要在堆疊上分配它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/418543.html
標籤:
