很可能我在某处错误地分配了内存
most likely I am allocating memory incorrectly somewhere
请帮帮我。我有一个功能。它应该删除索引号下的行。我正在创建一个新的二维数组。我为它分配内存。我从源数组中清除内存并重新分配给它。
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);
我就是这么叫它的
- 它不是二维数组,只是指针数组。您不必复制所有元素,只需复制指针。您不必为每一行传递已分配内存的大小,因为不需要它。
- 使用正确的尺码类型
- 您不需要新数组,但如果
createnew
参数为 true
. ,此函数将分配 return 一个
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;
}
请帮帮我。我有一个功能。它应该删除索引号下的行。我正在创建一个新的二维数组。我为它分配内存。我从源数组中清除内存并重新分配给它。
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);
我就是这么叫它的
- 它不是二维数组,只是指针数组。您不必复制所有元素,只需复制指针。您不必为每一行传递已分配内存的大小,因为不需要它。
- 使用正确的尺码类型
- 您不需要新数组,但如果
createnew
参数为true
. ,此函数将分配 return 一个
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;
}