c++ - 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;
}

最佳答案

Is there a difference between char a[n][m] & char a[][m]?

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

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

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


Also why it is not printing garbage

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

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


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

https://stackoverflow.com/questions/67586659/

相关文章:

c++ - 如何使函数能够接受原始指针作为迭代器?

bash - 在 bash 中按日期时间格式排序

java - 如何使用 Arrays.asList() 启动 LinkedList

c - 学习C——测试数据类型

python-3.x - DistutilsError : Could not find suita

laravel - Inertia.JS 在发布请求后重新加载 Prop

javascript - 如何在一组 span 元素之后替换纯文本内容或文本节点?

sql - 在 AWS Athena 中添加截止日期列

python - 如何在 python 中分组和计算二项式变量?并绘制这个图

java - 如何使用 Java 9+ 从 JDK 模块获取类的文件?