首页 > 解决方案 > 在C中的嵌套块中重新声明标识符

问题描述

我有一个指向主函数中的整数数组的指针,我为其分配了一个动态分配的内存块,以便我有一个二维矩阵。

就像是:

int (*b)[m] = malloc(m*m*sizeof( ... etc ...

但是我需要在嵌套块中重新声明(展平)这个矩阵,在其中我首先简单地使用相同的标识符(也许是出于纯粹的懒惰):

所以在嵌套范围内:

{
    int *b = (int *) b;
    ...
    ...
}

然后我用新的本地 b 在嵌套范围内调用一个函数,但它出现了段错误!但是,如果在同一个嵌套块中,我这样做:

{
    int *d = (int *) b;
    int *b = d;
    ...
    ...
}

仅仅因为我使用了一个临时的新 d 变量,然后重新声明 b 在本地将其初始化为 d,所以一切都按预期完美运行!所以我似乎无法在外部范围内声明和初始化同名(阴影)的变量。

关于为什么的任何线索?

标签: cpointersscopeinitialization

解决方案


在第一个片段中,

{
    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
    ...
    ...
}

而分配给db是外部范围b,接下来当你定义内部范围时b,外部的值b被分配给内部范围b


推荐阅读