【问题标题】:Why does array with variable-sized work but not dynamic array? [closed]为什么可变大小的数组可以工作而不是动态数组? [关闭]
【发布时间】:2021-07-04 14:45:56
【问题描述】:

首先,我是编程新手,不知道“可变大小数组”和“动态数组”是什么意思。 我只是用这些词来描述我的情况。随意使用正确的命名法进行编辑。 现在问题是,我有以下代码:-

...
int n;
printf("Enter number of rows/columns = ");
scanf(" %d",n);
int a[n][n];
...

...
int n;
n=6;
int a[n][n];
...
n=7;
...
n=4;
...

两者都编译成功。

  • 在第一种情况下,在执行scanf() 函数后程序崩溃。
  • 第二种情况完美。

为什么?

【问题讨论】:

  • 需要把变量的地址传给scanf:scanf(" %d", &n);
  • 当你定义一个数组时,它会在定义时获取维度。如果您稍后更改 n 的值,IT 真的不在乎。 n 是一个不相关的变量,而不是在任何时间点设置数组大小的幻数。
  • I am new to programming and don't know what "variable-sized array" and "dynamic array" mean - 这就是书本的用途。
  • 只有书籍才能帮助你

标签: arrays c scanf declaration variable-length-array


【解决方案1】:

scanf() 中使用&

当您使用来自<stdio.h>scanf 扫描用户输入时,您需要传递一个指向它的指针。您可以在此处阅读更多关于为什么会出现这种情况的信息:Use of & in scanf() but not in printf()

int n;
printf("Integer: ");
scanf("%d", &n);
int a[n][n];

变长数组

variable-length array 只是一个数组,其长度在运行时而不是在编译时确定。在您的情况下,长度由变量 n 确定,这使其成为可变长度数组。正如 cmets 中提到的Eugene Sh.,更改变量n 在定义后不会修改数组的长度。

【讨论】:

    【解决方案2】:

    在两个代码 sn-ps 中都使用了可变长度数组,因为在它们的声明中没有使用整数常量表达式来指定数组中元素的数量。

    没有动态分配的数组。

    第一个代码sn-p在调用scanf的语句中有bug。

    scanf(" %d",n);
    

    参数应该是指向变量n的指针。

    scanf(" %d", &n);
    

    即通过函数scanf改变变量n,你必须通过引用将它传递给函数。

    在 C 中,通过引用传递意味着通过指向对象的指针间接传递对象。因此,解除对指针的引用,函数将直接访问必须修改的对象。

    注意第二个代码sn -p在数组声明后改变变量n的值不会改变数组a的元素个数。

    int n;
    n=6;
    int a[n][n];
    ...
    n=7;
    ...
    n=4;
    

    根据数组声明前变量n 中存储的值,数组a 将恰好具有6 元素。

    这是一个演示程序。

    #include <stdio.h>
    
    int main(void) 
    {
        size_t n;
        
        do
        {
            printf( "Enter number of rows/columns (greater than 0 ) = " );
            
        } while ( !( scanf( "%zu", &n ) == 1 && n != 0 ) );
        
        int a[n][n];
        
        printf( "The size of the array declared like int a[%zu][%zu] is %zu.\n", 
                n, n, sizeof( a ) );
        
        return 0;
    }
    

    程序输出可能看起来像

    Enter number of rows/columns (greater than 0 ) = 10
    The size of the array declared like int a[10][10] is 400.
    

    可变长度数组应具有自动存储持续时间(也就是说,它不能在文件范围内声明或具有存储说明符static;它可以在块范围内声明)。

    来自 C 标准(6.7.6.2 数组声明符)

    4 如果大小不存在,则数组类型是不完整类型。如果 大小是 * 而不是表达式,数组类型是 未指定大小的变长数组类型,只能使用 在具有函数原型范围的声明或类型名称中;这样的 数组仍然是完整的类型。 如果大小是整数 常量表达式并且元素类型具有已知的常量大小, 数组类型不是变长数组类型;否则, 数组类型是变长数组类型。(变长数组 是实现不需要支持的条件特性;看 6.10.8.3.)

    【讨论】:

    • 赞成使用size_t 而不是int 作为数组长度。
    猜你喜欢
    • 2012-05-27
    • 2018-07-21
    • 2021-12-13
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多