c - 在C中的嵌套 block 中重新声明标识符

标签 c pointers scope initialization

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

类似于:

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/

相关文章:

使用 void 子函数更改 main 中的值

c - C语言递归函数的几个问题

c - 在 9 位架构中搜索 8 位对齐的字符串

c++ - 在 Windows 上存储信息有哪些选项?我应该如何阅读这些信息?

c - 最好使用 C/C++ 查找无效的 bz2 文件

c - 需要有关以下代码的输出的帮助,并在可能的情况下进行解释

c++ - 指向数组 c++ 的指针

C编程: malloc() inside another function

c++ - 为什么具有相同名称但不同签名的多个继承函数不会被视为重载函数?

java - 在 spring mvc 应用程序中使用 bean 作用域的最佳实践