代码
总结下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作为内存地址,试图转到该位置读出数据;而该位置的内存空间属于操作系统,为保护段空间不可访问,因而程序崩溃。
如果觉得《c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题》对你有帮助,请点赞、收藏,并留下你的观点哦!