提问人:ZSR 提问时间:1/10/2023 最后编辑:kiner_shahZSR 更新时间:1/10/2023 访问量:64
free() 的问题;具有 2 维数组,其中 C 是已知的
Issue with free(); with a 2 dimensions array of which one is known in C
问:
我想free();使用 malloc 后,其中一个维度是已知的 2 维数组。让我们以数组 psi[i][3] 为例;我被要求提供数组 t 是我不知道 i 大小的无符号 int 类型,所以我这样做了:
unsigned int (*psi)[3] = malloc(i * sizeof *psi);
if((psi)[3] == NULL ) {
printf("Error! memory not allocated.");
exit(0);
});
free(psi);
上述问题是,尽管我已经将 psi 数组声明为如上所述的无符号 int,但我仅在 free 中收到此错误:
error 257 [Error] 'psi' undeclared (first use in this function)
感谢您的帮助,并感谢大家抽出宝贵时间!
答:
-1赞
Dúthomhas
1/10/2023
#1
Typedefs 有很大帮助。这是您的固定尺寸内部尺寸:
typedef int three_ints[3];
现在,您可以更轻松地分配它们的动态数组:
three_ints * psi = malloc( nrows * sizeof(three_ints) );
if (!psi) {
complain();
}
并释放他们:
free( psi );
与任何 2D 数组一样,您可以使用通常的语法对其进行迭代:
for (int row = 0; row < nrows; row++)
{
for (int col = 0; col < 3; col++)
printf( "\t%d", psi[row][col] );
printf( "\n" );
}
评论
0赞
Lundin
1/10/2023
相反,将数组隐藏在 typedef 后面通常被认为是不可读且危险的,类似于将指针隐藏在 typedef 后面。许多人会认为这种代码混淆了。即使你不同意这一点,你最终仍然会宣扬主观的编码风格。
1赞
Dúthomhas
1/10/2023
不,你正在宣扬一个在整个行业中不存在的铁杆 C 理论家立场。给类型命名并没有错,即使该类型是一个数组。
0赞
Lundin
1/10/2023
有很多错误,因为就像在 typedef 后面隐藏指针一样,它隐藏了程序员的重要信息。Windows API 是完全损坏的类型系统的常用示例,可作为对其他系统的警告。隐藏这样的东西的问题在于它们仍然是数组,所以它们不像它们一目了然的常见类型那样遵循相同的规则。考虑。type try_this (void)
1赞
Eric Postpischil
1/10/2023
你可以忽略所谓的“建议”不要数组。我还没有看到好的例子或数据表明这对错误或工程成本有任何重大影响。例如,提供的“Windows API 是一个完全损坏的类型系统的常用示例,可以作为对其他人的警告”,最多是循环推理,给出 Windows API 有一个不好的例子,因为它可以作为警告或其他东西;没有实际后果相关。提供的示例代码 ,会立即生成编译器错误消息,并且很容易处理...typedef
type try_this (void)
1赞
Eric Postpischil
1/10/2023
@tstanisl:好吧,那里有一个问题,但为什么课程是“不要数组”?如果这是规则,那么有人可能会将数组封装在一个结构中,然后您将按值传递大量数据。这不是我们想要的解决办法。此外,还有第二个问题,您正在设置您不知道其表示形式的类型的原始字节。有一个不同的教训需要学习,一个解决所有这三个问题的经验教训:记录您导出到客户端的类型......typedef
评论
if((psi)[3] == NULL )
应该是if (psi == NULL )
psi
**
exit(0)
stdlib.h
exit()
EXIT_FAILURE