在C中重新声明嵌套块中的标识符

在C中重新声明嵌套块中的标识符,c,pointers,scope,initialization,C,Pointers,Scope,Initialization,我在一个主函数中有一个指向整数数组的指针,我给它动态分配了一块内存,这样我就有了一个2D矩阵 比如: int (*b)[m] = malloc(m*m*sizeof( ... etc ... 但是我需要在嵌套块中重新声明(展平)这个矩阵,在嵌套块中我首先简单地使用了相同的标识符(可能是出于纯粹的惰性): 因此,在嵌套范围中: { int *b = (int *) b; ... ... } 然后我用新的局部b调用嵌套范围内的函数,但它会出错! 但是,如果在同一嵌套块内执

我在一个主函数中有一个指向整数数组的指针,我给它动态分配了一块内存,这样我就有了一个2D矩阵

比如:

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根本不允许这样做。不要在评论中添加更正,你的帖子只是为了澄清问题