代码

总结下c语言中字符串数组的地址存放问题

#include <iostream>
using namespace std;
#include<bits/stdc++.h>int main()
{char *s;printf("s的地址是:%d\n", &s);s = "hello";char *p = s;printf("s存放的是hello的地址:%d\n",s);printf("p存放的是hello的地址:%d\n",p);printf("p的真实地址是:%d\n",&p);printf("&s存放的其实是s[0]的地址:%d\n", &s);printf("s[0]的地址:%d\n",&s[0]);printf("s[1]的地址%d\n",&s[1]);printf("从第1个字符串开始的字符串是%s\n", s);printf("从第2字符串开始的字符串:%s\n", &s[1]);return 0;
}

结果

s的地址是:2686648
s存放的是hello的地址:4231467
p存放的是hello的地址:4231467
p的真实地址是:2686644
&s存放的其实是s[0]的地址:2686648
s[0]的地址:4231467
s[1]的地址4231468
从第1个字符串开始的字符串是hello
从第2字符串开始的字符串:ello

需要注意

如果将s[1]以%s的形式输出来会造成内存泄漏

printf("%s\n", s[1]);

原因是:
printf函数以参数”%s”输出字符串时过程为:
(1)从首地址开始逐字节寻址,把存储单元(一个字节)内的数据转换为ASCII字符格式输出。
(2)直到某一个字节内存的元素为字符’\0’时,输出此字符并且寻址结束。

其中s[1]的值为e,我们可以通过以下代码查看字母形式和ASCII形式:

    printf("%c\n", s[1]);printf("%d\n", 'e');output:
e
101

那么printf会将s[1]对应的’e’,‘e’对应的ASCII码111作为内存地址,试图转到该位置读出数据;而该位置的内存空间属于操作系统,为保护段空间不可访问,因而程序崩溃。

c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题相关推荐

  1. c语言中字符串数组应用,C语言中字符变量字符串和字符数组应用.doc

    C语言中字符变量字符串和字符数组应用 字符变量(type`char`?字符串(string)和字符数组(type`char`arrary)是C语言中非常重要的结构成分,也是应用编程中常发生混淆?导致错 ...

  2. c语言字符指针清零,C语言中字符串的内存地址操作的相关函数简介

    C语言bcopy()函数:复制内存(字符串)头文件: #include bcopy() 函数用来复制内存(字符串),其原型为: void bcopy(const void *src, void *de ...

  3. c语言字符串转成二进制,C语言中字符串如何转换为二进制、八进制、十进制、十六进制...

    在C语言某个程序当中需要把文本16进制转换成对应的16进制数,比如字符串"0x1a"转换成10进制的26,可以用以下函数来实现 相关函数: atof, atoi, atol, st ...

  4. c语言字母转换数字代码,实现c语言中字符串和数字的相互转换的代码

    实现c语言中字符串和数字的相互转换的代码 引导语:代码就是程序员用开发工具所支持的语言写出来的源文件,是一组由字符.符号或信号码元以离散形式表示信息的明确的'规则体系.以下是百分网小编分享给大家的实现 ...

  5. 【示例】C语言中利用数组存放函数指针

    C语言中利用数组存放函数指针,增加函数使用的灵活性.使用时只需提供数组索引,即可调用不同函数. 预备知识: 1.指向函数的指针 一个函数在编译时被分配一个入口地址,这个地址就被称为函数的指针. 例如: ...

  6. C语言中字符串和字符数组的区别

    C语言中字符串和字符数组的区别 1.基本概念 2.代码分析 3.总结 1.基本概念 字符串和字符数组很相似,但是有本质上的区别. (1) C语言中,字符串是双引号括起来的单个或多个字符的集合,编译器自 ...

  7. C语言中字符串定义与文字常量区

    C语言中字符串定义与文字常量区 C语言的内存组织方式1>代码区,存放可执行代码2>全局存储区,存放所有全局变量和静态变量3>文字常量区,常量字符串4>堆区,malloc,new ...

  8. C语言中动态数组的作用,C语言实现动态数组

    前言 在纯C语言编程中,数组的创建必须是固定的大小,因为C语言本身没有提供动态数组这种数据结构,这是一个让习惯了使用高级语言编程的人转做C开发面临的一个很头疼的问题,本篇文章就将介绍如何使用纯C语言编 ...

  9. c语言中字符 12是多少,c语言中字符串的讲解(DOC可编).doc

    c语言中字符串的讲解(DOC可编).doc 第一部分:字符串的概念 ---字符串:用双引号引起来的一串字符.在C语言,系统将自动的为字符串添加一个结束标志\0 ,该结束标志不作为字符串的实际长度,但作 ...

最新文章

  1. k8s, etcd 多节点集群部署问题排查记录
  2. Pywinauto 应用后端类型选择错误:AttributeError: ‘NoneType‘ object has no attribute ‘backend‘. 原因及解决办法
  3. 图解算法学习笔记(目录)
  4. java窗体线条切换消失_java – 如何更改apache poi生成的图表不使用平滑线条并将空单元格显示为间隙?...
  5. Script Debugger + VS.Net调试javascript [转]
  6. [转帖]SQL SERVER 2005 安全设置
  7. 网上花店java项目_jsp+servlet开发java web网上花店商城系统,后台可配置化,方便修改,也可修改做成其他商城类项目...
  8. 王爽《汇编语言》笔记(详细)
  9. Mac版 matlab 安装 GAOT工具箱
  10. 黑苹果 无线网卡相关配置
  11. 【061】百度迁徙-用地图大数据演绎国人的迁徙史诗
  12. javaweb框架介绍
  13. facebook第三方登陆服务器验证
  14. msf生成win版免杀木马
  15. 打印机的系统是linux吗,linux下打印机的配置和使用
  16. xxl-job 带参数执行和高可用部署
  17. 来了!5G和AI的未来 这10位行业领袖这么说
  18. 2022-2027年中国企业社交网络市场规模现状及投资规划建议报告
  19. 上海青浦区大众驾校(科目二·自动挡)真实考场操作全程
  20. 【数据库】GaussDB

热门文章

  1. Python 多进程笔记 — 启动进程的方式、守护进程、进程间通信、进程池、进程池之间通信、多进程生产消费模型
  2. OpenCV 笔记(04)— OpenCV2 升级到 OpenCV3/CV4 的改动(去掉 CV_前缀、使用新的前缀替换、使用新的命名空间宏)
  3. 解决:sql中将日期字符串当做日期类型处理
  4. NVIDIA 认证系统
  5. 自动调试用于移动GPU的卷积网络
  6. 2021年大数据ELK(二十一):Logstash简介和安装
  7. 2021年大数据Spark(三十一):Spark On Hive
  8. [JavaScript] JavaScript 运算符与流程控制
  9. 上一篇的js处理失真数据存在问题换了种方法
  10. React接入Sentry.js