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

    原文作者:sty945
    原文地址: https://blog.csdn.net/sty945/article/details/80511498
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞