請幫我。我有一個功能。它應該洗掉索引號下的行。我正在創建一個新的二維陣列。我為它分配記憶體。我從源陣列中清除記憶體并再次為其分配記憶體。
int **matrix;
這是我的矩陣
int** delete_with_index(int n,int m, int **arr, int index){
int i, g;
int **new_arr;
new_arr= malloc(n*sizeof(int *));
for (i=0;i<n;i ){
new_arr[i]=malloc(m*sizeof(int));
}
for (i=0;i<n;i ){
for (g=0;g<m;g ){
new_arr[i][g]=arr[i][g];
}
free(arr[i]);
}
free(arr);
arr= malloc((n-1)*sizeof(int *));
for (i=0;i<(n-1);i ){
arr[i]=malloc(m*sizeof(int));
}
for (i=0;i<index;i ){
for (g=0;g<m;g ){
arr[i][g]=new_arr[i][g];
}
free(new_arr[i]);
}
for (i=index 1;i<n;i ){
for (g=0;g<m;g ){
arr[i][g]=new_arr[i-1][g];
}
free(new_arr[i-1]);
}
free(new_arr);
return arr;
}
這是我的功能
res_m = delete_with_index(n1, m1, res_m, index);
我就是這樣稱呼它的
uj5u.com熱心網友回復:
- 它不是二維陣列,只是指標陣列。您不必復制所有元素,只需復制指標。您不必為每一行傳遞分配的記憶體大小,因為它不是必需的。
- 使用正確的尺寸型別
- 您不需要新陣列,但如果
createnew引數為 ,此函式將分配并回傳一個陣列true。
int **deleteROW(const size_t rows, int **arr, size_t index, int createnew, int freeDeleted)
{
int **newArray = NULL;
if(arr && rows)
{
if(createnew)
{
newArray = malloc(sizeof(*newArray) * (rows - 1));
}
else
{
newArray = arr;
}
if(newArray)
{
if(freeDeleted) free(arr[index];
memmove(newArray, arr, index * sizeof(*newArray));
memmove(newArray index, arr index 1, (rows - index - 1) * sizeof(newArray));
}
}
return newArray;
}
如果您只想從指標陣列中洗掉一行:
int **deleteROW(const size_t rows, int **arr, size_t index, int freeDeleted)
{
int **newArray = NULL;
if(arr && rows)
{
if(freeDeleted) free(arr[index])
memmove(&arr[index], &arr[index 1], (rows - index - 1) * sizeof(*newArray));
}
return arr;
}
如果你想從一個真正的二維陣列中洗掉一行,你只需要:
void *deleteROW(const size_t rows, size_t cols, int (*arr)[cols], size_t index)
{
if(arr && rows && cols && index < rows - 1)
{
memmove(arr[index], arr[index 1], (rows - index - 1) * sizeof(*arr));
}
return arr;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/398019.html
下一篇:使用printf時函式輸出錯誤
