我在主函数中有一个指向整数数组的指针,我向该数组分配了动态分配的内存块,以便我有一个二维矩阵。
类似于:
int (*b)[m] = malloc(m*m*sizeof( ... etc ...
但是我需要在嵌套 block 中重新声明(展平)这个矩阵,在其中我首先简单地使用相同的标识符(也许纯粹是出于懒惰):
所以在嵌套范围内:
{
int *b = (int *) b;
...
...
}
然后我用新的本地 b 调用该嵌套作用域内的函数,但它出现段错误! 但是,如果在同一个嵌套 block 中,我会这样做:
{
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
。
关于c - 在C中的嵌套 block 中重新声明标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58873820/