C語言動態內存經典筆試題分析

C語言動態內存經典筆試題分析

文章目錄

  • C語言動態內存經典筆試題分析
    • 1. 題目一
    • 2. 題目二
    • 3. 題目三
    • 4. 題目四

1. 題目一

void GetMemory(char *p){p = (char *)malloc(100);}
void Test(void){char *str = NULL;GetMemory(str);strcpy(str, "hello world");printf(str);}

運行Test函數會有什么結果?

代碼運行時會崩潰
上述代碼中出現的問題

  1. malloc開辟的空間沒有釋放,內存泄漏
  2. 代碼會崩潰,即使GetMemory函數返回,str依然為NULL
  3. GetMemory函數無法把malloc開辟的100個字節帶回來

TIP:上述代碼中的printf(str);沒有錯,與printf(“abcdef”); printf(“%s”,str);一樣,都是將數組的首元素地址傳給kbd>printf

代碼出現的主要問題是GetMemory函數返回,str依然為NULL
在這里插入圖片描述
分析:
傳給GetMemory函數的只是str中的值,并不是str的地址,使用為傳值調用,傳值調用形參的改變并不會改變實參,形參只是實參的臨時拷貝,所以str中的值不會改變,在使用strcpy時,對NULL指針解引用了,導致程序崩潰

上述代碼的修改:

void GetMemory(char** p)
{*p = (char*)malloc(100);
}
void Test(void)
{char* str = NULL;GetMemory(&str);strcpy(str, "hello");printf(str);free(str);str = NULL;
}

2. 題目二

void GetMemory(char** p, int num)
{*p = (char*)malloc(num);
}
void Test(void)
{char* str = NULL;GetMemory(&str, 100);strcpy(str, "hello");printf(str);
}

運行Test函數會有什么結果?

正常打印hello

分析:
與題目一類似,不過這段代碼時將,str地址傳給了GetMemory函數,函數形參使用二級指針存放指針的地址,并將開辟好的空間的地址賦值給p,也就是str,代碼并沒有明顯問題,并不會像代碼一一樣崩潰

只不過這段代碼沒有釋放malloc開辟的空間,會導致內存泄漏

上述代碼的修改:

void GetMemory(char** p, int num)
{*p = (char*)malloc(num);
}
void Test(void)
{char* str = NULL;GetMemory(&str, 100);strcpy(str, "hello");printf(str);free(str);str = NULL;
}

3. 題目三

char* GetMemory(void)
{char p[] = "hello world";return p;
}
void Test(void)
{char* str = NULL;str = GetMemory();printf(str);
}

運行Test函數會有什么結果?
代碼打印的結果是不確定的

分析:
這段代碼錯就錯在返回了局部變量的地址,局部變量的生命周期在出作用域就結束了,也就是在調用完GetMemory函數之后,p就被銷毀了,還給了操作系統,在下面用指針接收了局部變量的地址時,這個指針就是野指針,代碼打印會出不確定的結果

可以簡化下這段代碼:

int* test()
{int n = 10;return &n;
}
int main()
{int* ret = test();printf("hello\n");printf("%d", *ret);return 0;
}

打印出的結果為不確定的
分析:
上述代碼就是明顯返回了局部變量的地址,如果沒有 printf(“hello\n”);這段的話,代碼雖然能正常運行但是不代表沒錯,printf(“hello\n”);這段的話破壞了函數的棧幀空間,導致打印的值不確定
在這里插入圖片描述
在運行代碼的時候,main函數開辟一塊空間,再為TestTest函數開辟一快空間,再為TestGetMemort函數開辟一快空間,GetMemort函數中有一個字符數組p,并且返回p的地址,數組名就是首字符地址,調用GetMemort函數結束,GetMemort函數被銷毀,還給了操作系統,當在打印數組之前,出現了其他代碼,就會破壞函數的棧幀空間,導致打印的值為不確定的

4. 題目四

void Test(void)
{char* str = (char*)malloc(100);strcpy(str, "hello");free(str);if (str != NULL){strcpy(str, "world");printf(str);}
}

代碼運行結果正常打印world
運行結果沒錯不代表結束沒錯

分析:
在上述代碼中,使用strcpy將“hello”拷貝到str中,然后使用free釋放了malloc開辟的空間,空間沒了,但是空間的地址還在,str沒有置NULL,此時str就是野指針,對野指針進行訪問就是非法訪問,因為野指針指向的一塊不屬于它的空間

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

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

相關文章

Qt設置類似于qq登錄頁面

頭文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QWindow> #include <QIcon> #include <QLabel> #include <QMovie> #include <QLineEdit> #include <QPushButton>QT_BEGIN_NAMESPACE namespace Ui { class…

中國移動公網IP申請過程

一、動機 由于從事互聯網行業10年&#xff0c;一直從事移動端&#xff08;前端&#xff09;開發工作&#xff0c;未曾深入了解過后端技術&#xff0c;以至于工作10年也不算進入互聯網的門。 所以準備在自己家用設備上搭建各種場景的服務器&#xff08;云服務對個人來說成本偏…

數據分析基礎之《numpy(2)—ndarray屬性》

一、ndarray的屬性 1、屬性方法 屬性名字屬性解釋ndarray.shape數組維度的元組&#xff08;形狀&#xff09;ndarray.ndim數組維數ndarray.size數組中的元素數量ndarray.itemsize一個數組元素的長度&#xff08;字節&#xff09;ndarray.dtype數組元素的類型使用方法 數組名.…

大數據技術8:StarRocks極速全場景MPP數據庫

前言&#xff1a;StarRocks原名DorisDB&#xff0c;是新一代極速全場景MPP數據庫。StarRocks 是 Apache Doris 的 Fork 版本。StarRocks 連接的多種源。一是通過這個 CDC 或者說通過這個 ETL 的方式去灌到這個 StarRocks 里面&#xff1b;二是還可以去直接的和這些老的 kafka 或…

阿里云服務器跨域問題解決方案

首先看一下原始代碼&#xff1a; Bean public CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source new UrlBasedCorsConfigurationSource();CorsConfiguration corsConfiguration new CorsConfiguration();corsConfiguration.addAllowedOrigin("http://…

spark rdd和dataframe的區別,結合底層邏輯

在 Apache Spark 中&#xff0c;RDD&#xff08;Resilient Distributed Dataset&#xff09;和 DataFrame 是處理數據的兩種不同的抽象。 RDD (Resilient Distributed Dataset) 底層實現&#xff1a; RDD 是 Spark 最初的數據抽象&#xff0c;表示一個分布式的、不可變的數據集…

03-詳解Nacos注冊中心的配置步驟和功能

Nacos注冊中心 服務注冊到Nacos Nacos是SpringCloudAlibaba的組件也遵循SpringCloud中定義的服務注冊和服務發現規范,因此使用Nacos與使用Eureka對于微服務來說并沒有太大區別 主要差異就是依賴不同,服務地址不同 第一步: 在父工程cloud-demo模塊的pom.xml文件中引入Spring…

nlkt中BigramAssocMeasures.pmi()方法的傳參和使用

這個問題找遍全網沒看到詳細的介紹&#xff0c;最后用讀代碼數學公式的方法才理解怎么用。 BigramAssocMeasures.pmi 作用&#xff1a;計算x和y的互信息&#xff08;互信息是什么我就不科普啦&#xff09; 這里有個誤區剛開始我以為是計算兩個詞之間的依賴程度&#xff0c;但…

flstudio21.3.2304高級版水果編曲音樂軟件

flstudio高級版是一款適用于廣泛領域的音頻編輯軟件。它支持多通道混音器和VST插件&#xff0c;包括數百種樂器和效果插件。它還為您提供了一個樂譜編輯器&#xff0c;需要對不同樂器的節奏進行必要的編輯。Flstudio具有許多內置電子合成聲音&#xff0c;可提供更廣泛的電子聲音…

自動駕駛的汽車構造

1、傳動系統 連接發動機和驅動車輪之間的動力傳動裝置&#xff0c;分為傳統動力傳動、純電動力傳動、混合動力傳動 傳動系統中幾個重要的部件 1&#xff09;離合器 直接與發動機相連的部件&#xff0c;通過摩擦、液體介質、磁力傳遞扭矩 作用&#xff1a; 保證平穩起步&a…

【Spring教程25】Spring框架實戰:從零開始學習SpringMVC 之 SpringMVC入門案例總結與SpringMVC工作流程分析

目錄 1.入門案例總結2. 入門案例工作流程分析2.1 啟動服務器初始化過程2.2 單次請求過程 歡迎大家回到《Java教程之Spring30天快速入門》&#xff0c;本教程所有示例均基于Maven實現&#xff0c;如果您對Maven還很陌生&#xff0c;請移步本人的博文《如何在windows11下安裝Mave…

Spring 面向切面編程(AOP)

一、aop介紹 &#xff08;一&#xff09;前言 一般的后端開發流程是縱向開發&#xff0c;就是controller&#xff08;控制層&#xff09;->service&#xff08;業務層&#xff09;->mapper&#xff08;數據持久層&#xff09;&#xff0c;Spring采用動態代理技術可以在…

Wireshark添加自定義協議解析

最終效果如下&#xff1a; 參考文檔&#xff1a;https://mika-s.github.io/topics/ 此參考文檔中7個例子教我們如何編寫lua腳本去識別我們自定義的協議 安裝Wireshark https://www.wireshark.org/上下載安裝包安裝即可。我的安裝路徑是D:\Install\Wireshark&#xff0c;在W…

Leetcode—389.找不同【簡單】

2023每日刷題&#xff08;五十五&#xff09; Leetcode—389.找不同 實現代碼 char findTheDifference(char* s, char* t) {int len strlen(s);int len2 len 1;int a[26] {0};int b[26] {0};if(len 0) {return t[0];}for(int i 0; i < len; i) {int idx s[i] - a;…

HTML的img常見應用屬性

1、src&#xff1a;指定圖像的URL&#xff0c;即圖像的路徑。 2、alt&#xff1a;指定圖像的替代文本&#xff0c;當圖像無法顯示時&#xff0c;會顯示替代文本。 3、width&#xff1a;指定圖像的寬度&#xff0c;可以使用像素值或百分比。 4、height&#xff1a;指定圖像的…

【設計模式--創建型--建造者模式】

建造者模式 建造者模式概述結構結果優缺點使用場景 將上述案例改為鏈式調用結果 建造者模式 概述 將一個復雜對象的構建與表示分離&#xff0c;使得同樣的構建過程可以創建不同的表示。 分離了部件的構建&#xff08;由Builder來負責&#xff09;和裝配&#xff08;由Direct…

辦公word-從不是第一頁添加頁碼

總結 實際需要注意的是&#xff0c;分隔符、分節符和分頁符并不是一個含義 分隔符包含其他兩個&#xff1b;分頁符&#xff1a;是增加一頁&#xff1b;分節符&#xff1a;指將文檔分為幾部分。 從不是第一頁插入頁碼1步驟 1&#xff0c;插入默認頁碼 自己可以測試時通過**…

win11 powershell conda 激活環境后不顯示環境名稱

win11 powershell conda 激活環境后不顯示環境名稱 問題現象解決方法 問題現象 安裝 Anaconda 后在 powershell 中激活環境后&#xff0c;命令行前面不顯示環境名稱 解決方法 在 powershell 中執行 conda init 重新打開 poweshell 出現以下問題&#xff0c;請參考 win11 p…

華為OD機試真題-5G網絡建設-2023年OD統一考試(C卷)

題目描述: 現需要在某城市進行5G網絡建設,已經選取N個地點設置5G基站,編號固定為1到N,接下來需要各個基站之間使用光纖進行連接以確保基站能互聯互通,不同基站之間架設光纖的成本各不相同,且有些節點之間已經存在光纖相連,請你設計算法,計算出能聯通這些基站的最小成本…

HarmonyOS鴻蒙應用開發——HTTP網絡訪問與封裝

文章目錄 基本使用封裝參考 基本使用 鴻蒙應用發起HTTP請求的基本使用&#xff0c;如下&#xff1a; 導入http模塊創建httpRequest對象發起http請求&#xff0c;并處理響應結果 第一、導入http模塊&#xff1a; import http from ohos.net.http第二、創建httpRequest對象&a…