二维数组功能测试,超详细

2023-05-16

#include <stdio.h>

int main()
{
char buf[2][5] = {'a','b','c','d','e','f','g','h','i','j'};

printf("buf[0] = %c\n",buf[0]);
printf("buf[0] = %d\n",buf[0]);
printf("buf[0] = %p\n",buf[0]);
printf("buf[0] = %s\n",buf[0]);

return 0;
}

编译后:
printf("buf[0] = %c\n",buf[0]);出现警告 format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘char *’
printf("buf[0] = %d\n",buf[0]);出现警告 format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘char *’

执行:

buf[0] = V
buf[0] = -1080815274
buf[0] = 0xbf941156
buf[0] = abcdefghij��

结论:这样定义一个二维数组,buf[0]是 char*类型而不是char类型
但是printf("buf[0] = %s\n",buf[0]); 打印出来的内容和预期的不一样,预期buf[0] = abcde


int main()
{
char buf[2][5] = {'a','b','c','d','e','f','g','h','i','j'};
char *p1 = buf[0];
char *p2 = buf[0][0];
char p3 = buf[0][0];
char **p4 = buf;

return 0;
}

编译执行出现的警告:
test_array.c:34:13: warning: initialization makes pointer from integer without a cast [enabled by default]
char *p2 = buf[0][0];
test_array.c:36:14: warning: initialization from incompatible pointer type [enabled by default]
char **p4 = buf;

分析:
33 行和35行没有警告 34 行有警告
恰恰说明了buf[0]是 char*类型而buf[0][0]是char类型
但是buf却不是char ** 类型,于是我们再做测试


int main()
{
char buf[2][5] = {'a','b','c','d','e','f','g','h','i','j'};

char *p5[] = buf;
char *p6[5] = buf;
char (*p7)[] = buf;
char (*p8)[5] = buf;

return 0;
}

编译后:
test_array.c:57:2: error: invalid initializer
char *p5[] = buf;
^
test_array.c:58:2: error: invalid initializer
char *p6[5] = buf;

再做测试:

int main()
{
char buf[2][5] = {'a','b','c','d','e','f','g','h','i','j'};

char (*p7)[] = buf;
char (*p8)[5] = buf;
char (*p9)[2] = buf;
char (*p10)[10] = buf;


return 0;
}

编译后:
test_array.c:80:18: warning: initialization from incompatible pointer type [enabled by default]
char (*p9)[2] = buf;
^
test_array.c:81:20: warning: initialization from incompatible pointer type [enabled by default]
char (*p10)[10] = buf;

说明buf的类型为 数组指针 并且可以写成 char (*)[] char (*)[5]


最后来解决 buf[0] = abcdefghij�� 这个问题

int main()
{
char buf0[2][5] = {'a','b','c','d','e','f','g','h','i','j'};
char buf1[2][5] = {{'a','b','c','d','e'},{'f','g','h','i','j'}};
char buf2[2][5] = {"abcd","fghi"};
char buf3[2][5] = {"abcde","fghij"};
char buf4[2][5] = {"abcde1","fghij"};

return 0;
}

编译后:
test_array.c:105:2: warning: initializer-string for array of chars is too long [enabled by default]
char buf4[2][5] = {"abcde1","fghij"};
^
test_array.c:105:2: warning: (near initialization for ‘buf4[0]’) [enabled by default]

分析: buf4报错可以理解,但是buf3为什么不抱错 这里不需要考虑 \0吗


再测试:

int main()
{
char buf0[2][5] = {'a','b','c','d','e','f','g','h','i','j'};
char buf1[2][5] = {{'a','b','c','d','e'},{'f','g','h','i','j'}};
char buf2[2][5] = {"abcd","fghi"};
char buf3[2][5] = {"abcde","fghij"};
printf("buf0[0] = %s\n",buf0[0]);
printf("buf1[0] = %s\n",buf1[0]);
printf("buf2[0] = %s\n",buf2[0]);
printf("buf3[0] = %s\n",buf3[0]);
return 0;
}

编译完全可以通过,没有任何警告。

buf0[0] = abcdefghijabcdefghijabcd
buf1[0] = abcdefghijabcd
buf2[0] = abcd
buf3[0] = abcdefghij �

分析:
从上面结果可以看出 char buf3[2][5] = {"abcde","fghij"}; 这样虽然在编译时没有错误,但是执行的结果却不是预期的
所以应该也是不行的。下面对 buf2[0] 再做下确认。



int main()
{
char buf2[2][5] = {"abcd","fghi"};
printf("buf2[0] = %s\n",buf2[0]);
printf("buf2[1] = %s\n",buf2[1]);
return 0;
}

编译执行得到结果:
buf2[0] = abcd
buf2[1] = fghi
这个和预期的完全一样

最后再测试这样一个问题,就是二维数组哪一纬不是必须的,依稀记得以前书本中有这样的事情:

int main()
{
char buf1[2][];
char buf2[][5];

return 0;
}

编译后:
test_array.c: In function ‘main’:
test_array.c:164:7: error: array type has incomplete element type
char buf1[2][];
^
test_array.c:165:7: error: array size missing in ‘buf2’
char buf2[][5];

定义并初始化,再做测试:

int main()
{
char buf1[2][] = {"abcd","fghi"};
char buf2[][5] = {"abcd","fghi"};

return 0;
}

编译后:
test_array.c:182:7: error: array type has incomplete element type
char buf1[2][] = {"abcd","fghi"};

分析:char buf2[][5] = {"abcd","fghi"}; 在定义时并进行初始化,第一维可以省略

然后我们再测试这样一个问题:

int main()
{
char buf2[][5] = {
"a",
"ab",
"abc"
};

printf("buf2[0] len = %d\n",sizeof(buf2[0]));
printf("buf2[1] len = %d\n",sizeof(buf2[1]));
printf("buf2[2] len = %d\n",sizeof(buf2[2]));
return 0;
}

编译运行结果:
buf2[0] len = 5
buf2[1] len = 5
buf2[2] len = 5

分析:这恰恰也说明了 char buf2[][5] = {"abcd","fghi"}; 第一维不用定义的合理性

到这里二维数组差不多就总结完成了。


总结:
1、二维数组在定义时如果进行初始化,则第一维可以不用给出具体数字
2、以 char buf2[2][5]为例 buf2[0][0] 为 char类型
buf2[0] 为 char *类型
buf2 为 char (*)[5]类型
3、若要在二维数组存储字符串,可以采用下面这种形式
char buf2[][5] = {
"a",
"ab",
"abc"
};
4、要注意字符串的长度不能超过数组第二维的坐标,否则会有错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二维数组功能测试,超详细 的相关文章

  • firebird数据库安装连接的一些常见错误及解决方法

    firebird数据库安装连接的一些常见错误及解决方法 最近有一个需求是把数据库里面的数据提取出来 xff0c 这个数据库的后缀是 fdb xff0c 查阅资料可知应该是firebird数据库的文件 xff0c 可是firebird数据库是
  • PX4与Gazebo、ROS/MAVROS以及QGC地面站之间的通信

    PX4与Gazebo ROS MAVROS以及QGC地面站之间的通信 一 整体框架 ROS xff08 机器人操作系统 xff09 可用于PX4和Gazebo模拟器 它使用MAVROS MAVLink节点与PX4通信 ROS Gazebo与
  • 四旋翼飞行器控制模型公式推导

    四旋翼飞行器控制模型 为便于建立模型 xff0c 现对四旋翼飞行器进行以下假设 xff1a 1 四旋翼飞行器是均匀对称的刚体 2 四旋翼飞行器的质量和转动惯量不发生改变 3 四旋翼飞行器的几何中心与其重心重合 4 四旋翼飞行器只受重力和螺旋
  • java中几种读取配置文件的方法

    java读取 properties配置文件的几种方法 xff08 1 xff09 Properties类读取 Properties类继承自Hashtable类并且实现了Map接口 xff0c 也是使用一种键值对的形式来保存属性集 不过Pro
  • Java项目分层

    MVC模式 在实际的开发中有一种项目的程序组织架构方案叫做MVC模式 xff0c 按照程序 的功能将他们分成三个层 xff0c 如下图 xff1a Modle层 xff08 模型层 xff09 View层 xff08 显示层 xff09 C
  • 简单介绍控制理论(经典、现代)

    1 经典和现代的区别和联系 xff08 1 xff09 区别 研究对象 经典控制系统一般局限于单输入单输出 线性定常系统 主要分为开环控制系统和闭环控制系统 严格的说 xff0c 理想的线性系统在实际中并不存在 实际的物理系统 xff0c
  • 框架中<include>**/*.xml</include>配置解释

    在mybatis Spring SpringMVC SpringBoot等框架的配置文件中经常会使用到如下代码 xff1a lt resource gt lt directory gt src main java lt directory
  • 反转单链表的几种方式对比(包括双指针法和递归)

    需求 xff1a 给你单链表的头节点 head xff0c 请你反转链表 xff0c 并返回反转后的链表 方式一 xff1a 双指针法 建立一个虚拟节点 class Solution public ListNode reverseList
  • 正则表达式 ^$ 同时出现代表什么

    与 同时出现在正则前后表示什么 xff1f 脱字符 xff1a 匹配开头 xff0c 若存在多行匹配多行的行头 美元符 xff1a 匹配尾部 xff0c 若存在多行匹配多行的尾部 同时写时只是限制字符的起点与终点 xff0c 比如 xff1
  • 设置虚拟机为固定IP,避免每次启动虚拟机都会分配新的IP地址

    采用一种最简单的方式 xff0c 通过修改配置文件来指定IP xff0c 并可以连接到外网 要求 xff1a 将IP地址配置为静态的 xff0c 比如设固定IP地址为192 168 117 131 打开文件 etc sysconfig ne
  • 我的2014--众人皆醉我独醒

    转眼间大学两年过去了 xff0c 舍友们还在撸游戏 xff0c 有的也找到了另一半的归属 我是我宿舍唯一一个不玩电脑游戏的人 xff0c 当然 xff0c 不是不玩游戏就代表着成绩很好 xff0c 也不代表玩游戏就不好 xff0c 但意味着
  • Java多线程通信-利用传统的线程通信wait(),notify()方法实现“生产者消费者模式”

    想利用传统的线程通信wait notify xff0c notifyAll 方法 xff0c 必须依赖于同步监听器的存在 xff0c 也就是说 xff0c 对于synchronized修饰的同步方法 xff0c 因为该类的默认实例 xff0
  • java TCP/IP实现简单的多人聊天功能

    TCP IP是可靠的网络协议 xff0c 数据的传输需要服务端和客户端之间三次 握手 xff0c 比较适合文本等一些可靠性要求高的数据传输 xff0c 但是它的效率较UDP低 下面通过一张图来简要说明使用 ServerSocket 创建 T
  • 死锁面试题(什么是死锁,产生死锁的原因及必要条件)

    什么是死锁 xff1f 所谓死锁 xff0c 是指多个进程在运行过程中因争夺资源而造成的一种僵局 xff0c 当进程处于这种僵持状态时 xff0c 若无外力作用 xff0c 它们都将无法再向前推进 因此我们举个例子来描述 xff0c 如果此
  • 标准模板库-容器

    标准模板库STL Standard Template Libarary 是一个标准类与函数模板的库 STL包含容器 容器适配器 迭代器 算法 函数对象和函数适配器 容器 用来存储和组织其他对象的对象 T是存储在容器中的元素类型的模板类型形参
  • Ubuntu18.04安装PX4踩坑、报错及解决方案整理

    笔者最近需要跑无人机巡检大坝的仿真 xff0c 于是在自己的Ubuntu2018 04中开始安装PX4 xff0c 问过不少之前已经装过PX4的师兄和同学 xff0c 都曾在PX4安装过程中踩过许多坑 xff0c 耗费了不少时间 xff0c
  • 初识ROS文件结构:以阿木实验室Prometheus项目为例

    ROS的工作空间是一个存放工程开发相关文件的文件夹 xff0c Fuerte版本之后的ROS默认使用的是Catkin编译系统 功能包是ROS软件中的基本单元 xff0c 包含ROS节点 库 配置文件等 一个文件夹是功能包的标志是该文件夹中有
  • 六轴无人机装配问题小结(Pixhawk飞控、APM固件、电机装配、电调校准)

    笔者近期需要组装一架六轴无人机供超声波避障模块 单点激光雷达等传感器的测试使用 由于是第一次碰真机 xff0c 面对散落一箱的部件还是非常的头大的 xff0c 不过好在实验室有经验的大佬能提供一些指导 xff0c 并且还能够参考 创客智造
  • 测试API接口,返回404。

    报错 xff1a 34 timestamp 34 34 2020 06 02T12 40 53 125 43 00 00 34 34 status 34 404 34 error 34 34 Not Found 34 34 message

随机推荐

  • 再谈STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法总结

    转自 xff1a http blog csdn net flydream0 article details 52317532 1 前言 bxCAN是STM32系列最稳定的IP核之一 xff0c 无论有哪个新型号出来 xff0c 这个IP核基
  • NVIDIA TX2自制底板的USB口无法使用的一种解决方法

    这是由于官方的底板上采用INA3221芯片做了电源监控电路 xff0c 只有确保5V电源达到要求的情况下才会使能USB口 而自制的底板上将上述电路省略了 xff0c 所以导致了USB口无法使用 解决办法就是要给TX2更新设备树 在网上找到一
  • Benchmark(基准测试)初相识

    一 benchmark概念 在计算中 xff0c 基准是运行一个计算机程序 一组程序或其他操作的行为 xff0c 以评估一个对象的相对性能 xff0c 通常是通过对它运行一些标准测试和试验 基准测试一词也通常用于精心设计的基准测试程序本身
  • 嵌入式中的通讯协议——UART、I2C、SPI、DMA

    目录 一 通讯的基本概念 二 USART 串口通讯 三 I2C通讯协议 四 SPI通讯协议 五 DMA 直接存储器存取 六 USART I2C SPI比较 一 通讯的基本概念 1 串行通讯与并行通讯 xff08 按数据的传送方式 xff09
  • RISC与CISC比较

    RISC的设计重点在于降低由硬件执行指令的复杂度 xff0c 因为软件比硬件容易提供更大的灵活性和更高的智能 xff0c 因此RISC设计对编译器有更高的要求 xff1b CISC的设计则更侧重于硬件执行指令的功能 xff0c 使CISC的
  • 操作系统选择调度方式和算法的若干准则

    1 调度的类型 按调度的层次 xff1a 长期 xff08 长程 作业 高级 xff09 调度 xff1b 中期 xff08 中级 中程 xff09 调度 xff1b 短期 xff08 短程 进程 低级 xff09 调度 按OS 的类型 x
  • 提灯过桥问题

    题目 xff1a 小明一家过一座桥 xff0c 过桥时是黑夜 xff0c 所以必须有灯 现在小明过桥要1秒 xff0c 小明的弟弟要3秒 xff0c 小明的爸爸要6秒 xff0c 小明的妈妈要8秒 xff0c 小明的爷爷要12秒 每次此桥最
  • 如何判断一个整数数组中是否有重复元素

    题目 xff1a 写一个函数判断一个int类型的数组是否是有效的 所谓有效是指 xff1a 假设数组大小为n xff0c 那么这个int数组里的值为0 n 1之间的数 xff0c 并且每个数只能出现一次 xff0c 否则就是无效数组 例如
  • C++发送HTTP请求---亲测可行

    转自 xff1a http hi baidu com benbearlove item 1671c23017575825b3c0c53f 环境 xp sp3 vs2008 vs2010在静态库中使用 MFC include lt afxwi
  • 百度2014开发测试工程师笔试题(沈阳站)

    时间 xff1a 2013 9 21 地点 xff1a 沈阳 职位 xff1a 开发测试工程师
  • 2014百度校招开发测试工程师笔试题

    时间 xff1a 2013 9 28 地点 xff1a 深圳 职位 xff1a 开发测试工程师
  • 整体了解HADOOP框架及一些开源项目

    Hadoop框架中 xff0c 有很多优秀的工具 xff0c 帮助我们解决工作中的问题 Hadoop的位置 从上图可以看出 xff0c 越往右 xff0c 实时性越高 xff0c 越往上 xff0c 涉及到算法等越多 越往上 xff0c 越
  • Kafka简介

    Kafka简介 在当前的大数据时代 xff0c 第一个挑战是海量数据的收集 xff0c 另一个就是这些数据的分析 数据分析的类型通常有用户行为数据 应用性能跟踪数据 活动数据日志 事件消息等 消息发布机制用于连接各种应用并在它们之间路由消息
  • Flume入门笔记------架构以及应用介绍

    在具体介绍本文内容之前 xff0c 先给大家看一下Hadoop业务的整体开发流程 xff1a 从Hadoop的业务开发流程图中可以看出 xff0c 在大数据的业务处理过程中 xff0c 对于数据的采集是十分重要的一步 xff0c 也是不可避
  • 分布式服务框架dubbo原理解析

    alibaba有好几个分布式框架 xff0c 主要有 xff1a 进行远程调用 类似于RMI的这种远程调用 的 dubbo hsf xff0c jms消息服务 napoli notify xff0c KV数据库 tair 等 这个框架 工具
  • Linux下安装ElasticSearch

    Linux下安装ElasticSearch 一 下载 amp 安装二 安装中遇到的问题及解决方案三 使用中遇到的问题及解决方案四 安装head五 安装kibana 一 下载 amp 安装 先安装JDK 下载elasticsearch 7 0
  • cmake学习1:基本的CMakeLists的编写

    前言 自己在使用cmake进行编译工程的时候不太了解cmake的基本使用方法 有时候出现找不到第三方库的问题也不知如何排查 因此相对cmake有个稍微系统的认识 希望能用这个强大的工具来更好的为自己的工程服务 因此总结为了几篇博客 主要参考
  • ZooKeeper 报错 ERROR [main:ZooKeeperServerMain@64] 的解决办法

    myid span class hljs type ERROR span main span class hljs type ZooKeeperServerMain span 64 span class hljs number 64 spa
  • Ubuntu14.04下安装cmake 3.9.6

    简述 xff1a CMake是一个跨平台 的编译自动配置 工具 xff0c 它使用一个名为CMakeLists txt 的文件来描述构建过程 xff0c 可以产生标准的构建文件 它可以用简单的语句来描述所有平台的安装 编译过程 它能够输出各
  • 二维数组功能测试,超详细

    include lt stdio h gt int main char buf 2 5 61 39 a 39 39 b 39 39 c 39 39 d 39 39 e 39 39 f 39 39 g 39 39 h 39 39 i 39 3