首页 > 解决方案 > char a[n][m] 和 char a[][m] 之间有区别吗?

问题描述

还有为什么当我提供 m > 我的列值时它不打印垃圾,就像第二种情况一样?有什么具体原因吗?

#include <iostream>
using namespace std;

int main()
{
    char a[2][5] = {{'a', 'b', 'c', 'd', 's'}, {'e', 'f', 'g', 'h', 'q'}};
    cout << a[0] << endl; // abcdsefghq!V
    cout << a[1] << endl; // efghq!V
    
    char a1[][6] = {{'a', 'b', 'c', 'd', 's'}, {'e', 'f', 'g', 'h', 'q'}};
    cout << a1[0] << endl; // abcds
    cout << a1[1] << endl; // efghq

    return 0;
}

标签: c++arraysmultidimensional-arraychar

解决方案


char a[n][m] 和 char a[][m] 之间有区别吗?

取决于上下文。首先是一个由 m 个字符组成的 n 个数组的数组。第二个是由 m 个字符组成的数组的未知边界数组。所以,它们是不同的类型。

但是,在示例中给出一个带括号的初始化列表时,未知边界的数组将被调整为已知边界的数组,其中边界是从初始化器的数量推导出来的。如果推导出的初始化器数量为 n,则调整后的类型将与 char[n][m] 完全相同。

简而言之,答案是:一般的区别是前者是已知边界的数组,后者是未知边界的数组,但是在这种情况下,将未知边界的数组调整为数组后没有区别的已知界限。


还有为什么它不打印垃圾

当您使用数组调用流插入运算符时,操作数衰减为指向第一个元素的指针。该流要求char*参数是指向以空字符结尾的字符数组的指针。违反此先决条件会导致未定义的行为。

您的数组a不包含空终止符。您的程序的行为是未定义的。


您应该避免未定义的行为。永远不要将非空终止数组传递给字符流


推荐阅读