C:转到,指针转换和“跳转到具有可变修改类型的标识符范围”

时间:2014-07-16 02:55:02

标签: c scope goto

以下代码是否会产生编译时错误:"跳转到具有可变修改类型的标识符范围"?如果数据在堆栈上动态保留,我可以理解为什么 C99标准具有此约束。但是我无法理解当声明是从一个简单的转换到堆中动态分配的块时产生的问题。

void ShowVariablyModifiedTypeBug(void)
{
    int rowCount = 2;
    int colCount = 5;
    int elementCount = rowCount * colCount;

    void *dataPtr = malloc(sizeof(int) * elementCount);
    if (!dataPtr) goto exit;
    int (*dataArr)[colCount] = (int (*)[colCount])dataPtr;

exit:
    return;
}

1 个答案:

答案 0 :(得分:1)

正如R. Sahu的评论所述,SO问题显然不符合标准。

C99 standard, paragraph 6.8.6.1

Constraints

[...] A goto statement shall not jump from outside the scope of an identifier
having a variably modified type to inside the scope of that identifier.

https://stackoverflow.com/a/20654413/434551中所述,错误:"跳转到具有可变修改类型的标识符范围"可以通过创建子范围来避免:

void ShowVariablyModifiedTypeBug(void)
{
    int rowCount = 2;
    int colCount = 5;
    int elementCount = rowCount * colCount;

    void *dataPtr = malloc(sizeof(int) * elementCount);
    if (!dataPtr) goto exit;

    {
    int (*dataArr)[colCount] = (int (*)[colCount])dataPtr;
    }

exit:
    return;
}