还有为什么当我像第二种情况一样提供 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/