c - 在C中的嵌套块中重新声明标识符
问题描述
我有一个指向主函数中的整数数组的指针,我为其分配了一个动态分配的内存块,以便我有一个二维矩阵。
就像是:
int (*b)[m] = malloc(m*m*sizeof( ... etc ...
但是我需要在嵌套块中重新声明(展平)这个矩阵,在其中我首先简单地使用相同的标识符(也许是出于纯粹的懒惰):
所以在嵌套范围内:
{
int *b = (int *) b;
...
...
}
然后我用新的本地 b 在嵌套范围内调用一个函数,但它出现了段错误!但是,如果在同一个嵌套块中,我这样做:
{
int *d = (int *) b;
int *b = d;
...
...
}
仅仅因为我使用了一个临时的新 d 变量,然后重新声明 b 在本地将其初始化为 d,所以一切都按预期完美运行!所以我似乎无法在外部范围内声明和初始化同名(阴影)的变量。
关于为什么的任何线索?
解决方案
在第一个片段中,
{
int *b = (int *) b; // this RHS `b` refers to the LHS `b`
...
...
}
你已经定义b
了,它遮蔽了外部范围b
,并使用内部b
来初始化自身(这基本上是无用的)。这就是为什么任何进一步的使用(因为它是指针类型,尝试取消引用它本质上是尝试取消引用无效内存,这会调用未定义的行为)是有问题的。
对于第二个片段,
{
int *d = (int *) b; // this is the outer scope 'b'
int *b = d; // now there is an inner scope b
...
...
}
而分配给d
,b
是外部范围b
,接下来当你定义内部范围时b
,外部的值b
被分配给内部范围b
。
推荐阅读
- r - 我的 bind_rows 抛出一个通常的错误 Can't combine `..1$Activity ID`
和`..2$Activity ID` > - prometheus - Grafana中的Prometheus,如何将单个查询向后移动
- gnuplot - 如何选择文件中的特定行作为 Gnuplot 的标题
- flutter - Flutter:以正确的方向和尺寸 A4 打印图像
- ios - iOS AWS SNS 创建平台应用程序失败并出现错误“读取所选证书时出错。”
- java - 为什么这个类的对象在不同的进程中没有正确序列化?
- google-classroom - 如何模拟复制菜单功能来重现下学期的教室?
- node.js - CSV_NON_TRIMABLE_CHAR_AFTER_CLOSING_QUOTE CSV 解析节点?
- validation - Blazor 覆盖 InputText 类(删除“修改后的有效”)
- amazon-web-services - LoadBalancer 和 EC2 实例之间的 AWS 加密连接