c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题
生活随笔
收集整理的這篇文章主要介紹了
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输出单个字符导致程序崩溃的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux watch命令
- 下一篇: 语音识别过程