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;
}
解决方案
char a[n][m] 和 char a[][m] 之间有区别吗?
取决于上下文。首先是一个由 m 个字符组成的 n 个数组的数组。第二个是由 m 个字符组成的数组的未知边界数组。所以,它们是不同的类型。
但是,在示例中给出一个带括号的初始化列表时,未知边界的数组将被调整为已知边界的数组,其中边界是从初始化器的数量推导出来的。如果推导出的初始化器数量为 n,则调整后的类型将与 char[n][m] 完全相同。
简而言之,答案是:一般的区别是前者是已知边界的数组,后者是未知边界的数组,但是在这种情况下,将未知边界的数组调整为数组后没有区别的已知界限。
还有为什么它不打印垃圾
当您使用数组调用流插入运算符时,操作数衰减为指向第一个元素的指针。该流要求char*
参数是指向以空字符结尾的字符数组的指针。违反此先决条件会导致未定义的行为。
您的数组a
不包含空终止符。您的程序的行为是未定义的。
您应该避免未定义的行为。永远不要将非空终止数组传递给字符流。
推荐阅读
- git - 为什么我需要拉取请求?
- python - Python:在 DataFrame 上转换时间单位
- javascript - D3.js 网络图
- ios - iphone X的应用程序全屏问题
- node.js - 基本身份验证并将令牌传递到下一个端点
- c# - 无法加载共享库“python37”或其依赖项之一
- apex - 为什么 huggingface bert pooler hack 让混合精度训练稳定?
- nginx - 如何使用 NGINX 重定向域和特定 URI?
- python - python 正则表达式模式查找
- c# - 在 IQueryable LINQ to Entities 查询中获取字典值