在C中重新声明嵌套块中的标识符
我在一个主函数中有一个指向整数数组的指针,我给它动态分配了一块内存,这样我就有了一个2D矩阵 比如:在C中重新声明嵌套块中的标识符,c,pointers,scope,initialization,C,Pointers,Scope,Initialization,我在一个主函数中有一个指向整数数组的指针,我给它动态分配了一块内存,这样我就有了一个2D矩阵 比如: int (*b)[m] = malloc(m*m*sizeof( ... etc ... 但是我需要在嵌套块中重新声明(展平)这个矩阵,在嵌套块中我首先简单地使用了相同的标识符(可能是出于纯粹的惰性): 因此,在嵌套范围中: { int *b = (int *) b; ... ... } 然后我用新的局部b调用嵌套范围内的函数,但它会出错! 但是,如果在同一嵌套块内执
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;
在这种情况下,b
的两个实例引用相同的变量。您正试图使用同一变量的未初始化版本初始化该变量。您应该使用(至少是中间)不同的名称来避免此问题。
这正是您在第二个代码段中所做的。在第一个代码段中,
{
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,您希望b
在同一声明中表示两个不同的事物。C根本不允许这样做。不要在评论中添加更正,你的帖子只是为了澄清问题