日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

發布時間:2023/11/28 生活经验 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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作為內存地址,試圖轉到該位置讀出數據;而該位置的內存空間屬于操作系統,為保護段空間不可訪問,因而程序崩潰。

總結

以上是生活随笔為你收集整理的c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。