c语言中char数组的结束位

2023-05-16

因为是半路出家学习cpp的,所以经常会对c语言里面的字符数组感到困惑,这次一次性做个总结。

  • 首先,结束位’/0‘只针对字符数组,不针对整型或者其他数组。
  • 其次,字符数组的大小只针对里面的字符的个数,和结束位无关。char i[1] = “1”; char i[] = {’1‘}; 和 char i[1]; 两个数组大小都是1。但是char i[] = “1”的大小是2,这种定义类似于char i[] = {‘1’, ‘\0’};。另外指针只能定义字符串char *i = “1”;不能写成char *i = {‘1’};
  • 一般而言,字符数组的size要超过里面元素的个数。这样的目的是保证结束位置在数组分配的内存地址里面。
    • 例如char i[1] = ‘1’; 和 char i[2] = ‘1’; 这两个字符数组在定义完之后,其最后一个元素’1‘后面都是结束位’/0‘,只不过一个是在数组分配的内存之外、一个在内部。在程序比较庞大的情况下,由于第一个结束位不在系统分配给数组的内存里面,属于“自由内存”,后面操作系统完全可以把他分配给其他变量,一旦操作系统把这个地址分配给其他变量那么第一个数组便失去了结束位,再利用printf(“s%”, i); 或者其他strcpy之类的函数操作时便会访问到数组之外的内存,直到再恰好碰到下一个结束位。
    • 在查这个资料的时候发现这样一段代码:
      #include <stdio.h>
      
      int main(void)
      {
      	char str1[5];
      	char str2[5];
      	int i;
      	for(i=0;i<5;i++)
      	{
      		str1[i]=i+65;
      		str2[i]=i+97;
      	}
      	printf("%s\n%s\n",str1,str2);
      	return 0;
      }
      
      输出:
      在这里插入图片描述
      以及
      #include <stdio.h>
      int main(void)
      {
      	char str1[16];
      	char str2[16];
      	int i;
      	for(i=0;i<16;i++)
      	{
      		str1[i]=i+65;
      		str2[i]=i+97;
      	}
      	printf("%s\n%s\n",str1,str2);
      	return 0;
      }
      
      其输出为:
      在这里插入图片描述
      说明了两个问题:
    1. 局部变量存储在栈上,栈的地址向下生长,所以str2的地址小于str1,这点可以在第二个代码中看出来——输出str2的时候实际输出是str2+str1,证明str2在低地址。另外从输出顺序来看,数组里面的内容依然是向上生长的。
    2. 查阅资料发现一个事实:连续定义的两个数组,当数组str2的长度小于等于16时,两数组头元素的距离为16;当数组str2的长度超过16但小于等于32时,两数组头元素的距离会变成32;当数组str2的长度超过32但小于等于48时,两数组头元素的距离会变成48;所以,一旦当str2数组大小为16、32、48……时,str1的结束位就会被覆盖掉,输出(%s,str2)时就会连带输出str1。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言中char数组的结束位 的相关文章

  • 在运行时将 char[x] 大小调整为 char[y]

    好吧 我希望我能正确解释这一点 我有一个结构 typedef struct MyData char Data 256 int Index MyData 现在 我遇到了一个问题 大多数时候MyData Data256 就可以了 但在某些情况下
  • 如何在 Python 中将字符转换为整数,反之亦然?

    我想得到 给定一个角色 它ASCII value 例如 对于角色a 我想得到97 反之亦然 Use chr http docs python org library functions html chr and ord http docs
  • 字符数组的初始值设定项字符串太长 C

    我正在开发一个程序 它接受输入并输出与输入相对应的数值 我在 char 部分收到错误 我不明白为什么当数组中只有 27 个字符且大小为 27 时会出现这样的错误 int main char greek 27 ABGDE ZYHIKLMNXO
  • 在 C 中将 char 数组转换为 int 数字

    我想将 char array 转换为 char myarray 4 1 2 3 where the means it is negative 所以它应该是整数 1234 使用standard图书馆在C 我找不到任何优雅的方法来做到这一点 我
  • 如何将此代码转换为使用字符串

    char recursivecombo char str int choices int level int len strlen str level if level choices for int i 0 i lt len 2 i pr
  • 从文件中读取为 char 数组

    我正在从文件中读取 当我读取时 它会逐行读取并打印它 我想要的正是我想要一个 char 数组来保存文件中的所有字符并打印一次 这是我的代码 if strcmp str 0 0 FILE filecomand char fname 40 ch
  • C++ 中的 Char* 与 String Speed

    我有一个 C 程序 它将从二进制文件中读取数据 最初我将数据存储在std vector
  • 从 ostream 获取 char* 而不进行复制

    我有一个ostream并且数据已写入其中 现在我想要该数据的形式char大批 有没有办法在不复制所有字节的情况下获取字符缓冲区及其大小 我的意思是 我知道我可以使用ostringstream并打电话str c str 但会产生一个临时副本
  • char类型可以归类为整数吗?

    刚才我读到 char是Java中唯一的无符号整型原始类型 这是否意味着 char 是 Java 中的整型类型之一 和C一样 最近我读到C类型包括标量类型 函数类型 联合类型 聚合类型 标量类型包括指针类型和算术类型 那么算术类型包括整型和浮
  • 将 char 数组转换为单个 int?

    有人知道如何将 char 数组转换为单个 int 吗 char hello 5 hello 12345 int myNumber convert char to int hello Printf My number is d myNumbe
  • 初始化无符号字符的正确方法*

    正确的初始化方法是什么unsigned char 我目前正在这样做 unsigned char tempBuffer tempBuffer 或者我应该使用memset tempBuffer 0 sizeof tempBuffer 要 正确
  • С++ 中的字符串文字是在静态内存中创建的吗?

    C 中的字符串文字是否在静态内存中创建并仅在程序退出时销毁 是的 字符串文字在程序的整个持续时间内都有效 即使在静态对象销毁期间也是如此 标准中的2 13 4 1说 普通字符串文字具有 n const char 数组 类型和静态存储持续时间
  • C 删除文件最后 n 个字符

    我需要使用 C 代码从文件中删除最后 n 个字符 起初我尝试使用 b 但它返回了分段错误 我看到类似问题的有趣答案here https stackoverflow com questions 584639 truncate file and
  • ChrW(e.KeyCode) 在 C# 中的等价物是什么?

    在VB NET 2008中 我使用了以下语句 MyKeyChr ChrW e KeyCode 现在我想将上面的语句转换成C 有任何想法吗 快速而肮脏的相当于ChrW在 C 中只是将值转换为char char MyKeyChr char e
  • char * 变量地址与 char[] 变量地址

    我从以下两个声明和初始化中打印出地址和字符串 char strPtr char This is a string made on the fly char charArray Chars in a char array variable 打
  • 为什么这段带有“1234”的代码可以在 C++ 中编译?

    为什么会这样编译 char ch 1234 no error 但不能超过 4 个chars char ch 12345 error Too many chars in constant 是的 我知道 用于一个char and 用于字符串 我
  • 强制 telnet 客户端进入字符模式

    我有一个应用程序 我接受来自 telnet 客户端的套接字连接 并建立一个简单的键盘驱动的字符 GUI telnet 客户端 至少在 Linux 上 默认为一次一行模式 所以我总是必须这样做 mode char手动 浏览相关 RFC 表明
  • 在C#中,如何检测一个字符是否是非ASCII字符?

    我想在 C 中检查 char 是否包含非 ASCII 字符 检查特殊字符的最佳方法是什么 例如志 or ASCII 范围为 0 127 因此只需检查该范围 char c a or whatever char you have bool is
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 正则表达式可以与 C++ 中的字符数组一起使用吗

    我正在开发一个无法使用字符串库文件的程序 而是使用字符数组 我能够使用正则表达式 并且想知道是否有办法使用正则表达式和字符数组 甚至正则表达式和单个字符 我问的原因是当我尝试在匹配中使用我的 char 数组时 xUtility 会抛出一堆来

随机推荐

  • 嵌入式FreeRTOS学习八,xTaskCreate创建任务的细节以及恢复中断任务实现

    一 创建任务函数xTaskCreate 任务也不是很复杂的东西 xff0c 任务也就是一个函数xTaskCreate 简单得说 xff0c 创建一个任务 xff0c 你得提供它的执行函数 xff0c 你得提供它的栈的大小 xff0c 函数的
  • 嵌入式FreeRTOS学习一,FreeRTOS概述和代码结构

    一 FreeRTOS是什么 FreeRTOS 是由 Real Time Engineers Ltd 出品 xff0c 是一款市场领先的 RTOS 现在已经支持几十种 处理器架构 Free即免费的 xff0c RTOS全称是 Real Tim
  • 嵌入式FreeRTOS学习二,FreeRTOS任务的创建和删除

    一 任务的创建和删除 1 1 函数xTaskCreate 此函数用来创建一个任务 xff0c 任务需要RAM来保存与任务有关的状态信息 任务控制块 xff0c 任务也需要一定的RAM 来作为任务堆栈 如果使用函数xTaskCreate 来创
  • 嵌入式FreeRTOS学习五,FreeRTOS任务调度器

    四 调度器 FreeRTOS 操作系统支持三种调度方式 xff1a 抢占式调度 xff0c 时间片调度和合作式调度 实际应用主要是抢占式调度和时间片调度 xff0c 合作式调度用到的很少 启动调度器的API函数vTaskStartSched
  • 嵌入式FreeRTOS学习九,任务链表的构成,TICK时间中断和任务状态切换调度

    一 tskTaskControlBlock 函数结构体 在tskTaskControlBlock 任务控制块结构体中 xff0c 其中有任务状态链表和事件链表两个链表成员 xff0c 首先介绍任务状态链表这个结构 xff0c 这个链表通常用
  • 嵌入式FreeRTOS学习十,任务调度和任务就绪链表任务调度过程

    一 main函数里面的栈是哪里分配的 main函数里面用到的栈 xff0c 假设为msp 是汇编代码里面设定的 xff0c 对于STM32F103 在汇编代码里的向量表设置了一个栈 initial sp 那这个栈是给谁用的呢 xff1f 可
  • ovn 通过网关虚拟路由器连接外部网络

    本文实验如何通过ovn的网关逻辑路由器将ovn网络连接到外部网络 前面讲过ovn的逻辑路由器是分布式的 xff0c 这意味着它没有绑定到某个节点上 xff0c 而是存在于所有节点上的 xff0c 同时它是通过每个节点的openflow流表来
  • 嵌入式FreeRTOS学习十一,深入理解任务调度机制

    一 任务调度机制 可抢占 xff1a 高优先级的任务先运行时间片轮转 xff1a 同优先级的任务轮流执行空闲任务礼让 xff1a 如果有同是优先级为0的其他就绪任务 xff0c 空闲任务主动放弃一次运行机会函数调用vTaskDelay xD
  • SOAP传输协议

    一 HTTP传输协议 超文本传输协议 xff08 HyperText Transfer Protocol xff0c 缩写 xff1a HTTP xff09 xff0c 它是基于请求 响应的模式协议 xff0c 客户端发出请求 xff0c
  • ONVIF简介

    一 什么是ONVIF ONVIF规范描述了网络视频的模型 接口 数据类型以及数据交互的模式 并复用了一些现有的标准 xff0c 如WS系列标准等 ONVIF规范的目标是实现一个网络视频框架协议 xff0c 使不同厂商所生产的网络视频产品 x
  • gsoap工具生成onvif设备搜索(remotediscovery)代码框架

    什么是gsoap工具 xff1f gSOAP 提供了两个工具来方便开发人员使用 C C 43 43 语言快速开发Web 服务应用 xff0c 通过 gSOAP 提供的这两个工具 xff0c 开发人员可以快速生成服务端与客户端代码框架 xff
  • 001_初识_飞航科技光标飞控

    这两天老潘给我一块飞控 xff0c 让我练手 xff0c 为电赛做准备 xff0c 拿到控挺开心的 xff0c 毕竟省了一笔RMB 本来想着买块正点原子的飞控 资料 xff1a 说起资料简单看了一下发现还蛮全的 xff0c 但是这个资料我居
  • 写出C语言的第一个程序“Hello World”

    这里写自定义目录标题 写出C语言的第一个程序 Hello World 写出C语言的第一个程序 Hello World 下面展示一些 内联代码片 span class token comment A code block span span
  • Eigen库的安装攻略

    Eigen库的安装攻略 转载 xff1a Eigen库安装 xff08 两种方式 xff09 转载 xff1a Eigen库安装 xff08 两种方式 xff09 链接 link
  • 【ROS2基础学习】

    入门篇 前言一 创建一个功能包二 编译三 source总结 前言 提示 xff1a 这里是记录的大概内容 xff1a 随着机器人技术的不断发展 xff0c ROS也越来越重要 xff0c 很多人都开启了学习ROS xff0c 本文就介绍了R
  • Arduino 外部中断重置内部定时器

    Arduino 外部中断重置内部定时器 文章目录 Arduino 外部中断重置内部定时器前言一 准备工作二 代码三 实验效果1 设置1Hz的方波 xff08 外部中断触发 xff09 xff1a 2 观察示波器各个波形 xff1a 3 延迟
  • ALUBI LPMS-IG1 RS232 IMU ROS2驱动安装

    文章目录 前言一 下载官方系列文档二 windows上的上位机程序安装2 Ubuntu上的ROS2驱动安装Offset Mode 2 总结 前言 IMU在自动驾驶领域广泛应用 xff0c 本文主要记录了在ROS2中使用ALUBI LPMS
  • ovn-northd 源码分析

    ovn northd是ovn中的核心后台进程 xff0c 主要负责将ovn的高层配置转换成供ovn controller后台进程使用的逻辑配置 xff0c 更详细的说就是它将ovn northbound数据库中传统意义上的逻辑网络配置转换成
  • 镭神CH128x1系列激光雷达使用记录

    镭神CH128x1系列激光雷达使用记录 文章目录 镭神CH128x1系列激光雷达使用记录前言一 操作步骤1 PC连接雷达 二 实验1 雷达控制器上的接口 xff1a 2 接口定义3 Rviz中显示效果 总结致谢 前言 本条博客的需求来源于自
  • c语言中char数组的结束位

    因为是半路出家学习cpp的 xff0c 所以经常会对c语言里面的字符数组感到困惑 xff0c 这次一次性做个总结 首先 xff0c 结束位 0 只针对字符数组 xff0c 不针对整型或者其他数组 其次 xff0c 字符数组的大小只针对里面的