代码
总结下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作为内存地址,试图转到该位置读出数据;而该位置的内存空间属于操作系统,为保护段空间不可访问,因而程序崩溃。