C語言:指針(5)

1. sizeof與strlen的對比

1.1 sizeof

sizeof屬于是操作符,用于計算變量所占的空間大小,單位為字節。如果操作數是類型的話,計算的是使用類型創建的變量所占內存空間的大小。

sizeof只計算數據在內存中所占的空間大小,而不在乎內存中存放的數據類型。

例如:

int main()
{int a = 10;printf("%d\n",sizeof a);printf("%d\n", sizeof(a));printf("%d\n", sizeof(int));return 0;
}
4
4
4

1.2 strlen

strlen是C語言庫函數,其功能為求字符串長度。函數原型如下:

 size_t strlen ( const char * str );

strlen函數會統計指針str指向的那個地址向后直到字符 '\0' 之前的所有字符個數。

但是,strlen函數會一直向后尋找直到找到 '\0' 為止,所以說有越界訪問的可能性。

int main()
{char arr1[] = "abd";char arr2[] = {'a','b','c'};printf("%d\n", strlen(arr1));printf("%d\n", strlen(arr2));return 0;
}
3
6

這里在創建第二個字符串時沒有加上 '\0' ,所以第二行輸出的是一個隨機結果。像arr1這樣創建字符串,編譯器會自動在末尾加上一個 '\0' ,所以第一行的輸出結果是確定的。

1.3?sizeof 和strlen的對比

sizeof

1.sizeof是操作符

2.sizeof計算操作數所占內存的大小,單位是字節

3.不關注內存中存放什么數據

strlen

1. strlen是庫函數,使用需要包含頭文件 <string.h>

2.strlen用于求字符串長度,統計字符串中字符 '\0' 之前字符的個數

3.關注內存中是否存在字符 '\0' ,如果不存在,就會一直向后尋找,可能會越界。

2. 數組和指針題目解析

2.1 一維數組

int main()
{int a[] = {1,2,3,4};printf("%d\n",sizeof(a));printf("%d\n",sizeof(a+0));printf("%d\n",sizeof(*a));printf("%d\n",sizeof(a+1));printf("%d\n",sizeof(a[1]));printf("%d\n",sizeof(&a));printf("%d\n",sizeof(*&a));printf("%d\n",sizeof(&a+1));printf("%d\n",sizeof(&a[0]));printf("%d\n",sizeof(&a[0]+1));return 0;
}

下面為解析:

int main()
{int a[] = {1,2,3,4};printf("%d\n",sizeof(a));  //sizeof中a單獨出現,表示整個數組,結果為16printf("%d\n",sizeof(a+0));//(a+0),這里a表示數組首元素地址,整體屬于整型指針,結果為4/8printf("%d\n",sizeof(*a));//(*a),這里的a表示數組首元素地址,*a表示首元素,類型為整型,結果為4printf("%d\n",sizeof(a+1));//(a+1),a表示數組首元素地址,與整數1相加,整體屬于整型指針,結果為4/8printf("%d\n",sizeof(a[1]));//a[1],a表示數組首元素地址,利用操作符[1]來訪問數組中下標為1的元素,類型為整型,結果為4printf("%d\n",sizeof(&a));//&a,得到的是整個數組的地址,類型為int(*)[4],結果為4/8printf("%d\n",sizeof(*&a));//(*&a),操作符*與&抵消,最終為a,表示整個數組,結果為16printf("%d\n",sizeof(&a+1));//&a+1,&a得到整個數組地址,+1后跳過整個數組,但是其結果類型依舊為 int(*)[4],結果為4/8printf("%d\n",sizeof(&a[0]));//&a[0],a[0]訪問數組中下標為0的元素,即首元素,操作符&得到該元素的地址,類型為整型指針,結果為4/8printf("%d\n",sizeof(&a[0]+1));//&a[0]+1,&a[0]得到數組首元素地址,+1后跳過一個元素,結果類型為整型指針,結果為4/8return 0;
}
16
8
4
8
4
8
16
8
8
8

2.2 字符數組

2.2.1 字符串末尾無 '\0'

代碼1:

int main()
{char arr[] = {'a','b','c','d','e','f'};printf("%d\n", sizeof(arr));printf("%d\n", sizeof(arr+0));printf("%d\n", sizeof(*arr));printf("%d\n", sizeof(arr[1]));printf("%d\n", sizeof(&arr));printf("%d\n", sizeof(&arr+1));printf("%d\n", sizeof(&arr[0]+1));return 0;
}

解析:

int main()
{char arr[] = {'a','b','c','d','e','f'};printf("%d\n", sizeof(arr));//szieof中數組名arr單獨出現,表示整個數組,結果為6printf("%d\n", sizeof(arr+0));//arr+0,表示數組首元素地址,類型為字符指針,結果為4/8printf("%d\n", sizeof(*arr));//*arr,arr表示數組首元素地址,*arr表示首元素,類型為字符,結果為1printf("%d\n", sizeof(arr[1]));//arr[1],表示數組中下標為1的元素,類型為字符,結果為1printf("%d\n", sizeof(&arr));//&arr,&arr得到整個數組的地址,類型為 char(*)[6],結果為4/8printf("%d\n", sizeof(&arr+1));//&arr+1,&arr得到整個數組的地址,+1跳過整個數組,但結果類型依舊為為char(*)[6],結果為4/8printf("%d\n", sizeof(&arr[0]+1));//&arr[0]+1,&arr[0]得到首元素的地址,+1后向后跳過一個元素,結果類型為字符指針,結果為4/8return 0;
}
6
8
1
1
8
8
8

代碼2:

int main()
{char arr[] = {'a','b','c','d','e','f'};printf("%d\n", strlen(arr));printf("%d\n", strlen(arr+0));printf("%d\n", strlen(*arr));printf("%d\n", strlen(arr[1]));printf("%d\n", strlen(&arr));printf("%d\n", strlen(&arr+1));printf("%d\n", strlen(&arr[0]+1));return 0;
}

解析:

int main()
{char arr[] = {'a','b','c','d','e','f'};printf("%d\n", strlen(arr));//arr表示數組首元素地址,但是數組中沒有字符'\0',strlen函數會從arr指向的地址向后一直尋找直到找到'\0',結果為隨機值printf("%d\n", strlen(arr+0));//arr表示首元素地址,+0后依舊為首元素地址,結果同第一行結果printf("%d\n", strlen(*arr));//arr為首元素地址,*arr得到首元素字符a,被傳遞給函數后,a會被轉化為其ASCII碼值97,并且函數會將97作為地址處理,但是這個地址通常是無法訪問的,因此編譯時會報錯,運行會導致程序崩潰printf("%d\n", strlen(arr[1]));//arr[1],為數組中下標為1的元素,即為b,其結果同第三行printf("%d\n", strlen(&arr));//&arr,&arr得到整個數組的地址,strlen函數會從arr指向的地址向后一直尋找直到找到'\0',結果為隨機值printf("%d\n", strlen(&arr+1));//&arr+1,&arr得到整個數組的地址,+1后跳過整個數組,strlen函數向后一直尋找直到找到'\0',結果為隨機值    printf("%d\n", strlen(&arr[0]+1));//&arr[0]+1,&arr[0]得到數組首元素的地址,+1跳過一個元素,strlen函數向后一直尋找直到找到'\0',結果為隨機值    return 0;
}

將編譯錯誤的語句注釋之后得到如下的打印結果:

11
11
11
5
10

2.2.2?字符串末尾存在?'\0'

代碼3:

int main()
{char arr[] = "abcdef";printf("%d\n", sizeof(arr));printf("%d\n", sizeof(arr+0));printf("%d\n", sizeof(*arr));printf("%d\n", sizeof(arr[1]));printf("%d\n", sizeof(&arr));printf("%d\n", sizeof(&arr+1));printf("%d\n", sizeof(&arr[0]+1));return 0;
}

解析:

int main()
{char arr[] = "abcdef";//這樣創建字符串時,編譯器為自動在字符串末尾加上一個'\0'printf("%d\n", sizeof(arr));//sizeof中數組名arr單獨出現,表示整個數組,數組中一共有"abcdef"以及末尾的'\0',類型都為字符,因此結果為7//其他的打印不受影響,不過&arr的類型變為了char(*)[7],結果與上面一致,printf("%d\n", sizeof(arr+0));printf("%d\n", sizeof(*arr));printf("%d\n", sizeof(arr[1]));printf("%d\n", sizeof(&arr));printf("%d\n", sizeof(&arr+1));printf("%d\n", sizeof(&arr[0]+1));return 0;
}
7
8
1
1
8
8
8

代碼4:

int main()
{char arr[] = "abcdef";printf("%d\n", strlen(arr));printf("%d\n", strlen(arr+0));printf("%d\n", strlen(*arr));printf("%d\n", strlen(arr[1]));printf("%d\n", strlen(&arr));printf("%d\n", strlen(&arr+1));printf("%d\n", strlen(&arr[0]+1));return 0;
}

解析:

int main()
{char arr[] = "abcdef";//這樣創建字符串,編譯器會自動在字符串末尾加上'\0'printf("%d\n", strlen(arr));//arr,arr表示數組首元素,字符串末尾中有'\0',結果為6printf("%d\n", strlen(arr+0));//arr+0,arr表示數組首元素,+0后依舊為數組首元素,字符串末尾中有'\0',結果為6printf("%d\n", strlen(*arr));//編譯器報錯,原因同代碼2printf("%d\n", strlen(arr[1]));//編譯器報錯,原因同代碼2printf("%d\n", strlen(&arr));//&arr,&arr得到整個數組的地址,字符串末尾中有'\0',結果為6printf("%d\n", strlen(&arr+1));//&arr+1,&arr得到整個數組的地址,+1后跳過整個數組,strlen函數向后一直尋找直到找到'\0',結果為隨機值printf("%d\n", strlen(&arr[0]+1));//&arr[0]+1,&arr[0]得到數組首元素的地址,+1后跳過一個元素,字符串末尾存在'\0',結果為5return 0;
}

將報錯語句注釋掉后的打印結果:

6
6
6
5
5

這里,倒數二行的輸出結果為5屬于是巧合,將字符串中的字符刪去兩個后,其結果如下:

int main()
{char arr[] = "abcf";printf("%d\n", strlen(arr));printf("%d\n", strlen(arr+0));printf("%d\n", strlen(&arr));printf("%d\n", strlen(&arr+1));printf("%d\n", strlen(&arr[0]+1));return 0;
}
4
4
4
5
3

可以發現,除了倒數第二行打印結果不變外,其余打印結果都發生了變化,并且剛好是原本結果減去2。

2.2.3 用字符型指針存儲常量字符串地址

代碼5:

int main()
{char *p = "abcdef";printf("%d\n", sizeof(p));printf("%d\n", sizeof(p+1));printf("%d\n", sizeof(*p));printf("%d\n", sizeof(p[0]));printf("%d\n", sizeof(&p));printf("%d\n", sizeof(&p+1));printf("%d\n", sizeof(&p[0]+1));return 0;
}

解析:

int main()
{char *p = "abcdef";//將字符串首字符地址存儲在字符型指針p中printf("%d\n", sizeof(p));//p在sizeof中單獨使用,表示字符串首字符的地址,類型為字符型指針,結果為4/8printf("%d\n", sizeof(p+1));//p+1,p代表字符串首字符的地址,+1后跳過一個字符,結果類型依舊為字符型指針,結果為4/8printf("%d\n", sizeof(*p));//*p,p為字符串首字符地址,*p得到首字符,即為a,類型為字符,結果為1printf("%d\n", sizeof(p[0]));//p[0],編譯器處理p[0]時,轉化為*(p+0),結果同第三行printf("%d\n", sizeof(&p));//&p,得到指針p的地址,類型為char**,結果為4/8printf("%d\n", sizeof(&p+1));//&p,得到指針p的地址,+1后跳過一個char**類型的空間大小即跳過指針p的地址,指向存儲指針p處地址后的地址,結果類型依舊為char**,結果為4/8printf("%d\n", sizeof(&p[0]+1));//&p[0]+1,轉化為&*(p+0)+1,*與&抵消,因此結果為p+1,指向字符中第二個字符處,即為存儲字符b的地址,結果類型為char*,結果為4/8return 0;
}
8
8
1
1
8
8
8

代碼6:

int main()
{char *p = "abcdef";printf("%d\n", strlen(p));printf("%d\n", strlen(p+1));printf("%d\n", strlen(*p));printf("%d\n", strlen(p[0]));printf("%d\n", strlen(&p));printf("%d\n", strlen(&p+1));printf("%d\n", strlen(&p[0]+1));return 0;
}

解析:

int main()
{char *p = "abcdef";//字符串末尾存在'\0'printf("%d\n", strlen(p));//p為字符串首字符地址,傳遞給函數strlen,結果為6printf("%d\n", strlen(p+1));//p+1,p為字符串首字符地址,+1后跳過一個字符,傳遞給函數strlen,結果為5printf("%d\n", strlen(*p));//編譯器報錯,結果同代碼2printf("%d\n", strlen(p[0]));//編譯器報錯,結果同代碼2printf("%d\n", strlen(&p));//&p,&p得到指針p的地址,地址未知,但肯定不與字符串中任意一個字符重疊,傳遞給函數strlen后,結果為隨機值printf("%d\n", strlen(&p+1));//&p,&p得到指針p的地址,+1后地址依舊未知,但肯定不與字符串中任意一個字符重疊,傳遞給函數strlen后,結果為隨機值printf("%d\n", strlen(&p[0]+1));//&p[0]+1,&p[0]得到字符串首字符地址,+1后跳過一個字符,傳遞給函數strlen,結果為5return 0;
}
6
5
0
5
5

這里的倒數第二行打印結果也屬于巧合,可以跳過修改字符串驗證:

int main()
{char *p = "abef";printf("%d\n", strlen(p));printf("%d\n", strlen(p+1));printf("%d\n", strlen(&p));printf("%d\n", strlen(&p+1));printf("%d\n", strlen(&p[0]+1));return 0;
}
4
3
0
5
3

2.3 二維數組

代碼7:

int main()
{int a[3][4] = {0};printf("%d\n",sizeof(a));printf("%d\n",sizeof(a[0][0]));printf("%d\n",sizeof(a[0]));printf("%d\n",sizeof(a[0]+1));printf("%d\n",sizeof(*(a[0]+1)));printf("%d\n",sizeof(a+1));printf("%d\n",sizeof(*(a+1)));printf("%d\n",sizeof(&a[0]+1));printf("%d\n",sizeof(*(&a[0]+1)));printf("%d\n",sizeof(*a));printf("%d\n",sizeof(a[3]));return 0;
}

解析:

int main()
{int a[3][4] = {0};//創建一個二維數組并將內部元素全部初始化為0printf("%d\n",sizeof(a));//sizeof中數組名a單獨出現,表示整個數組,結果為48printf("%d\n",sizeof(a[0][0]));//a[0][0],a[0][0]表示數組中首元素,類型為整型數據,結果為4printf("%d\n",sizeof(a[0]));//二維數組a中,當sizeof中a[0]單獨出現,表示數組中的整個第一行,結果為16printf("%d\n",sizeof(a[0]+1));//a[0]+1,此處a[0]表示數組第一行首元素地址,+1后跳過一個元素,最終結果類型為整型指針,打印結果為4/8printf("%d\n",sizeof(*(a[0]+1)));//*(a[0]+1),a[0]+1表示數組中第一行第二個元素的地址,加上*表示該地址處存儲的數據,該數據類型為整型,結果為4printf("%d\n",sizeof(a+1));//a+1,a代表二維數組首行的地址,+1后跳過一整行,表示數組中第二行的地址,結果為4/8printf("%d\n",sizeof(*(a+1)));//*(a+1),a+1表示數組中第二行的地址,加上*,得到整個第二行,結果為16printf("%d\n",sizeof(&a[0]+1));//&a[0]+1,&a[0]表示數組中整個第一行的地址,類型為int(*)[4],+1后跳過一整行,但數據類型依舊為int(*)[4],結果為4/8printf("%d\n",sizeof(*(&a[0]+1)));//&a[0]+1,&a[0]表示數組中整個第一行的地址,類型為int(*)[4],+1后跳過一整行,此時指向第二行地址,加上*后,得到整個第二行,結果為16printf("%d\n",sizeof(*a));//*a,a表示二維數組首行的地址,加上*后,表示整個數組首行,結果為16printf("%d\n",sizeof(a[3]));//a[3]表示數組整個第四行,雖然此時屬于數組訪問越界,但是編譯器依舊將其作為數組的行類型處理,結果為16return 0;
}
48
4
16
8
4
8
16
8
16
16
16

數組名的意義:

1.sizeof(數組名),這里的數組名表示整個數組,計算的是整個數組的大小。

2.?&數組名,這里的數組名表示整個數組,取出的是整個數組的地址。

3. 除此之外所有的數組名都表示首元素的地址。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93198.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93198.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93198.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

rent8 安裝部署教程之 Windows

1. Apache 安裝與配置 1.1. 獲取并解壓 Apache 在 Apache Lounge 網址下載編譯版的 Apache。下載完成后&#xff0c;將壓縮包解壓到 d:\web\Apache24 作為 Apache 的安裝目錄。 1.2. 配置 Apache 打開配置文件 conf\httpd.conf&#xff0c;找到第 37 行配置。 ? Define SRVROO…

邊緣智能實戰手冊:攻克IoT應用三大挑戰的AI戰術

前言&#xff1a;在當前的AIoT&#xff08;人工智能物聯網&#xff09;賽道上&#xff0c;將AI能力下沉至邊緣設備已不再是“要不要做”的選擇題&#xff0c;而是“如何做好”的必答題。然而&#xff0c;在實際項目中&#xff0c;工程師們常常會遇到性能、功耗和隱私這“三座大…

【React】use-immer vs 原生 Hook:誰更勝一籌?

1.概述 use-immer 不屬于官方 Hook&#xff0c;是社區維護的第三方庫&#xff01;use-immer 通過封裝 Immer 的不可變更新機制&#xff0c;為 React 開發者提供了一種更直觀、高效的狀態管理方式。它尤其適合處理復雜嵌套狀態或需要頻繁更新的場景&#xff0c;同時保持了與 Re…

【案例】Vue3 實現高性能級橫向循環滾動生產線效果:基于 requestAnimationFrame 的流暢動畫方案

動畫效果在工業監控系統、生產看板等場景中&#xff0c;經常需要模擬生產線的動態運行效果。本文將基于 Vue3 和 requestAnimationFrame 實現一個高性能的橫向循環滾動效果&#xff0c;完美模擬生產線傳輸帶的視覺體驗。我們將從代碼實現到原理分析&#xff0c;全面講解如何打造…

萬字長文解碼如何玩轉Prompt(附實踐應用)

在AI技術迅猛發展的今天&#xff0c;如何與大型語言模型高效“對話”已成為釋放其潛力的關鍵。本文深入探討了提示詞工程&#xff08;Prompt Engineering&#xff09;這一新興領域&#xff0c;系統解析了從基礎概念到高級技巧的完整知識體系&#xff0c;并結合“淘寶XX業務數科…

easyExcel嵌套子集合導出Excel

我想要的Excel效果說明: 1.創建兩個自定義注解:ExcelMerge(表示主對象內的單個屬性,后續會根據子集合的大小合并下面的單元格),ExcelNestedList(表示嵌套的子集合) 2.NestedDataConverter.java 會把查詢到的數據轉換為一行一行的,相當于主表 left join 子表 ON 主.id子.主id的形…

基于 C# WinForm 字體編輯器開發記錄:從基礎到進階

目錄 基礎版本實現 進階版本改進 字體設置窗體增強 主窗體改進 功能對比 項目在本文章的綁定資源中免費的&#xff0c;0積分就可以下載哦~ 在 Windows Forms 應用開發中&#xff0c;字體編輯功能是許多文本處理軟件的基礎功能。本文將分享一個簡易字體編輯器的開發過程&a…

Linux基本使用和Java程序部署(含 JDK 與 MySQL)

文章目錄Linux 背景知識Linux 基本使用Linux 常用的特殊符號和操作符Linux 常用命令文本處理與分析系統管理與操作用戶與權限管理文件/目錄操作與內容處理工具Linux系統防火墻Shell 腳本與實踐搭建 Java 部署環境apt&#xff08;Debian/Ubuntu 系的包管理利器&#xff09;介紹安…

抗輻照CANFD通信芯片在高安全領域國產化替代的研究

摘要&#xff1a;隨著現代科技的飛速發展&#xff0c;高安全領域如航空航天、衛星通信等對電子設備的可靠性與抗輻照性能提出了極高的要求。CANFD通信芯片作為數據傳輸的關鍵組件&#xff0c;其性能優劣直接關系到整個系統的穩定性與安全性。本文聚焦于抗輻照CANFD通信芯片在高…

Mybatis 源碼解讀-SqlSession 會話源碼和Executor SQL操作執行器源碼

作者源碼閱讀筆記主要采用金山云文檔記錄的&#xff0c;所有的交互圖和代碼閱讀筆記都是記錄在云文檔里面&#xff0c;本平臺的文檔編輯實在不方便&#xff0c;會導致我梳理的交互圖和文檔失去原來的格式&#xff0c;所以整理在文檔里面&#xff0c;供大家閱讀交流. 【金山文檔…

Java集合類綜合練習題

代碼 import java.util.*; class ScoreRecord {private String studentId;private String name;private String subject;private int score;public ScoreRecord(String studentId, String name, String subject, int score) {this.studentId studentId;this.name name;this.s…

秒懂邊緣云|1分鐘了解邊緣安全加速 ESA

普通開發者如何搭建安全快速的在線業務才能性價比最高 &#xff1f;阿里云現已為開發者推出免費版邊緣安全加速 ESA&#xff0c;1 個產品就能把 CDN 緩存 API 加速 DNS WAF DDoS 防護全部搞定&#xff0c;還支持邊緣函數快速部署網站和 AI 應用&#xff0c;性價比拉滿。 1…

數據結構:串、數組與廣義表

&#x1f4cc;目錄&#x1f524; 一&#xff0c;串的定義&#x1f330; 二&#xff0c;案例引入場景1&#xff1a;文本編輯器中的查找替換場景2&#xff1a;用戶手機號驗證&#x1f4da; 三&#xff0c;串的類型定義、存儲結構及其運算&#xff08;一&#xff09;串的抽象類型定…

服務器路由相關配置Linux和Windows

服務器路由相關配置Linux和Windowscentos路由系統核心概念傳統工具集(命令)iproute2 工具集&#xff08;推薦&#xff09;NetworkManager 工具路由配置文件體系高級路由功能策略路由多路徑路由路由監控工具系統級路由配置啟用IP轉發路由守護進程路由問題診斷流程Windows 路由Wi…

Spring Boot啟動事件詳解:類型、監聽與實戰應用

1. Spring Boot啟動事件概述1.1 什么是Spring Boot啟動事件在Spring Boot的應用生命周期中&#xff0c;從main方法執行到應用完全就緒&#xff0c;期間會發生一系列事件&#xff08;Event&#xff09;。這些事件由Spring Boot框架在特定時間點觸發&#xff0c;用于通知系統當前…

Python閉包詳解:理解閉包與可變類型和不可變類型的關系

一、定義閉包&#xff08;Closure&#xff09; 指的是一個函數對象&#xff0c;即使其外部作用域的變量已經不存在了&#xff0c;仍然能訪問這些變量。簡單來說&#xff0c;閉包是由函數及其相關的環境變量組成的實體。def outer():x 10def inner():print(x)return innerf ou…

BotCash:GPT-5發布觀察 工程優化的進步,還是技術突破的瓶頸?

BotCash&#xff1a;GPT-5發布觀察 工程優化的進步&#xff0c;還是技術突破的瓶頸&#xff1f; 在GPT-4以多模態能力震撼業界的一年后&#xff0c;GPT-5的亮相顯得有些“平靜”。當人們期待著又一場顛覆性技術革命時&#xff0c;這場發布會更像是給大模型技術按下了“精細打磨…

AJAX學習(2)

目錄 一.XMLHttpRequest 二.XMLHttpRequest——查詢參數 三.案例——地區查詢 四.XMLHttpRequest_數據提交 五.Promise 六.Promise三種狀態 七.PromiseeeXHR獲取省份列表&#xff08;案例&#xff09; 八.封裝-簡易axios-獲取省份列表 九.封裝-簡易axios-獲取地區列表 …

解決 pip 安裝包時出現的 ReadTimeoutError 方法 1: 臨時使用鏡像源(單次安裝)

解決 pip 安裝包時出現的 ReadTimeoutError 當您在使用 pip 安裝 Python 包時遇到 pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(hostfiles.pythonhosted.org, port443): Read timed out. 錯誤時&#xff0c;這通常是由于網絡問題導致的連接超時。P…

Linux下使用Samba 客戶端訪問 Samba 服務器的配置(Ubuntu Debian)

在 Linux 系統中&#xff0c;Samba 提供了與 Windows 系統文件共享的便利方式。本文將詳細介紹在 Ubuntu 和 Debian 系統下如何安裝 Samba 客戶端、訪問共享資源&#xff0c;并實現遠程目錄掛載和開機自動掛載。 文章參考自&#xff08;感謝分享&#xff09;&#xff1a;https…