gpt4 book ai didi

c - C99 中与调整参数相关的未定义行为

转载 作者:行者123 更新时间:2023-12-04 04:30:24 25 4
gpt4 key购买 nike

我不理解 C99 标准中的以下未定义行为:

An adjusted parameter type in a function definition is not an objecttype (6.9.1)


从标准来看,函数的参数需要在两种情况下进行调整:
  • 一个数组被调整为一个指针,
  • 并且将函数调整为指向函数的指针。

  • 在第二种情况下,函数的调整参数确实不是对象(据我所知,标准区分了对象和函数):

    An identifier can denote an object; a function; a tag or a member of astructure, union...


    您能否澄清这一点并提供此类 UB 的示例?

    最佳答案

    C 标准的第一个引用是不正确的。这听起来像

    — An adjusted parameter type in a function definition is not acomplete object type (6.9.1)


    那就是你省略了 complete这个词.
    例如,在与其定义不同类型的函数声明中,您可以指定不完整​​的对象类型,例如
    void f( size_t, size_t, int [][*] );
    在这个函数声明中,第三个参数的声明不是一个完整的对象类型,因为数组元素的大小是未知的。
    这是一个演示程序
    #include <stdio.h>

    void f( size_t, size_t, int [][*] );

    void f( size_t m, size_t n, int a[][n] )
    {
    for ( size_t i = 0; i < m; i++ )
    {
    for ( size_t j = 0; j < n; j++ )
    {
    a[i][j] = n * i + j;
    }
    }
    }

    void g( size_t, size_t, int [][*] );

    void g( size_t m, size_t n, int a[][n] )
    {
    for ( size_t i = 0; i < m; i++ )
    {
    for ( size_t j = 0; j < n; j++ )
    {
    printf( "%d ", a[i][j] );
    }
    putchar( '\n' );
    }
    }

    int main(void)
    {
    size_t m = 2, n = 3;
    int a[m][n];

    f( m, n, a );
    g( m, n, a );

    return 0;
    }
    它的输出是
    0 1 2 
    3 4 5
    这里在程序中这两个函数声明
    void f( size_t, size_t, int [][*] );
    void g( size_t, size_t, int [][*] );
    有一个对象类型不完整的参数声明。
    你不能使用这样的声明,它的定义是相同的类型,例如
    void f( size_t m, size_t n, int a[][*] )
    {
    // ...
    }
    因为在将第三个参数调整为指针后,编译器无法确定指针类型。即指针将具有不完整的对象类型 int ( * )[] .

    关于c - C99 中与调整参数相关的未定义行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65792546/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com