首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改后的类型是否仅为VLA?

修改后的类型是否仅为VLA?
EN

Stack Overflow用户
提问于 2022-03-30 22:35:56
回答 2查看 137关注 0票数 2

一个简单的问题:可变修改的类型是否仅为VLA (可变长度数组)?

C11,6.10.8.3条件特性宏,1(重点添加):

__STDC_NO_VLA__整数常量1,用于指示实现不支持可变长度数组可变修改的类型。

这是否意味着除了VLA之外,还有一种可变的修改类型?有什么例子吗?

“可变修改类型”和“可变长度数组”之间的关系是什么?

额外:“可变长度数组”的定义取决于“已知常量大小”的定义:

如果大小是整数常量表达式,且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型;否则,数组类型是可变长度数组类型。

然而,“已知常量大小”的定义取决于“可变长度数组”的定义:

A类型具有已知的常量,如果该类型不是不完整的,并且不是可变长度数组类型。

有点困惑。

相关博士:http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_312.htm

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-30 22:56:56

是否意味着除了VLA之外,还有一种可变的修改类型?有什么例子吗?

根据C标准(6.7.6减车员)

3完全声明器是一个声明器,它不是另一个声明器的一部分。如果在完整声明器中的声明器嵌套序列中存在指定可变长度数组类型的声明器,则称完全声明器指定的类型是可变修改的。此外,从可变修改类型派生的声明器类型派生的任何类型本身也是可变修改的。

这是一个演示程序

代码语言:javascript
复制
#include <stdio.h>

int main( void )
{
    for ( size_t n = 1; n < 10; n++ )
    {
        typedef int ( *Ptr )[n];
        Ptr p;

        printf( "sizeof( *p ) = %zu\n", sizeof( *p ) );
    }
}

程序输出是

代码语言:javascript
复制
sizeof( *p ) = 4
sizeof( *p ) = 8
sizeof( *p ) = 12
sizeof( *p ) = 16
sizeof( *p ) = 20
sizeof( *p ) = 24
sizeof( *p ) = 28
sizeof( *p ) = 32
sizeof( *p ) = 36

在这个程序中,指针类型Ptr定义为int( * )[n],是一个可变修改的类型。

这句话

如果类型不是不完整且不是可变长度数组类型,则

A类型已知常量大小。

这意味着这些类型的sizeof操作符是在编译时计算的,与运行时对可变长度数组类型的计算相反,并且在程序执行过程中这类类型的大小不会改变。

与下面的引文相比,引文有不同的含义

如果大小是整数常量表达式,且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型;否则,数组类型是可变长度数组类型。

这说明了如何区分可变长度数组的声明和非可变长度数组的声明。

票数 2
EN

Stack Overflow用户

发布于 2022-03-30 22:59:44

C 2018年6.7.6 3说:

如果在完整声明器中的声明器嵌套序列中存在指定可变长度数组类型的声明器,则称完全声明器指定的类型是可变修改的。此外,从可变修改类型派生的声明器类型派生的任何类型本身也是可变修改的。

因此,对于某些非常量的int (*)[n],即使它是一个指针,它也是一个可变的修改类型。此外,int [3][n]是一种可变的修改类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71684881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档