200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题

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

时间:2018-11-21 00:45:02

相关推荐

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

代码

总结下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的地址是:2686648s存放的是hello的地址:4231467p存放的是hello的地址:4231467p的真实地址是:2686644&s存放的其实是s[0]的地址:2686648s[0]的地址:4231467s[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:e101

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。