gpt4 book ai didi

c - 在 C 中通过释放和重用指针转置数组

转载 作者:太空宇宙 更新时间:2023-11-04 02:30:38 25 4
gpt4 key购买 nike

我一直在研究显示转置包含整数的二维数组结果的代码。我的目标是用它的转置替换原始数组而不是创建一个副本,并且我在内存分配方面遇到了问题。一开始我通过 scanf() 获取行数 (m) 和列数 (n),然后在 main() 函数中为数组分配内存,如下所示:

int **mtr=(int **)malloc(m*sizeof(int *));
for(int i=0;i<m;i++)
mtr[i]=(int *)malloc(n*sizeof(int));

然后我调用我的函数来转置数组,如下所示:

void transposeMatrix(int m,int n,int mtr[m][n])
{
int temp[m][n];
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
temp[i][j]=mtr[i][j];
}
}
for(int i=0;i<m;i++)
free(mtr[i]);
free(mtr);
mtr=(int **)malloc(n*sizeof(int *));
for(int i=0;i<n;i++)
mtr[i]=(int *)malloc(m*sizeof(int));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
mtr[i][j]=temp[j][i];
}
}
}

我的目标是首先将原始“mtr”的值存储在临时“temp”数组中,然后释放分配给“mtr”的内存,然后再次分配内存,切换行和列以使用相同的“mtr”回到主要()。然而在线:

mtr[i]=(int *)malloc(m*sizeof(int));

我得到“错误:赋值给具有数组类型的表达式”。 mtr[i] 不应该在那个时候被释放吗?有谁知道问题出在哪里?

最佳答案

这个:

int **mtr /* ... */;

声明一个指向int 的指针。目标指针可能是此类指针数组中的第一个,但在任何情况下,此处都不会涉及二维数组。二维数组是数组的数组,它的所有成员数组在内存中都是连续的。指向数组的指针数组不能保证这一点(只有指针必须是连续的,而不是它们指向的对象)。而且,mtr指针不能直接转换为第一个元素指向的数组第一个int的指针。

您可以通过许多与真正 2D 数组相同的方式使用指向指针数组形式的指针,但作为此函数的参数不是其中之一:

void transposeMatrix(int m,int n,int mtr[m][n])

您的编译器应该对此发出警告。对您而言,最简单的解决方案(至少让您克服第一个障碍)是将函数声明为接受正确类型的参数:

void transposeMatrix(int m,int n,int **mtr) { // ...

然而,您仍然会遇到麻烦,因为尽管该函数可以重新分配或释放 + malloc 其 mtr 参数指向的内存,但不会修改调用者的副本指针。有两种方法可以解决这个问题:

  1. 声明函数接受指向调用者指针的指针,或者
  2. 让函数返回修改后的指针值。

实现后者需要对代码进行较少的更改:

int **transposeMatrix(int m,int n,int **mtr) {
// ...
return mtr;
}

// ...

// call the function as:
mtr = transposeMatrix(m, n, mtr);

关于c - 在 C 中通过释放和重用指针转置数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43812031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com