C語言 子函數調malloc申請內存返回給主函數使用——可行,但要注意

一般情況,子函數中動態申請內存,將地址返回給主函數,理論上應該也是可以的,需要子函數返回動態內存地址,主函數實參是相應的地址變量即可。只不過,主函數實參傳入子函數之前,可能會將指針置空,那么,子函數就不能動態申請內存了。

如下例子:

C語言進階---動態內存管理_c語言怎么遍歷動態申請里面的內容-CSDN博客

4.幾個經典的面試題

4.1 題目1:
void Getmemory(char* p)//形參是實參的一份臨時拷貝 p是指針變量 p指向NULL *p是NULL
{p = (char*)malloc(100);//p由指向NULL 變為指向malloc開辟空間的起始地址
}
void Test(void)
{char* str = NULL;GetMemory(str);//傳的是實參strcpy(str, "helllo world");printf(str);
}
//程序會崩潰無法打印

更正:通過傳實參的地址來找到實參在內存當中的位置然后再改變實參的值:

void GetMemory(char** p)//char**p接收str的地址,是一個二級指針
{*p = (char*)malloc(100);//*p==str 由指向NULL 變為指向malloc開辟空間的起始地址
}
void Test(void)
{char* str = NULL;GetMemory(&str);//轉str的地址strcpy(str, "helllo world");printf(str);free(str);str = NULL;
}
int main()
{Test();return 0;
}
//程序會正常打印"hello world"

另一個傳地址的例子:

4.2題目2:

返回棧空間問題:

char* GetMemory(void)
{char p [] = "hello world";//棧空間開辟數組return p;//p放在寄存器當中,這個函數可以成功返回數組名p,也就是數組的首元素地址}
void Test(void)
{char* str = NULL;str = GetMemory();printf(str);
}
int main()
{Test();return 0;
}
//棧空間在用完之后會被系統回收,因此創建的數組p在GetMemory調用完之后就已經被銷毀無法使用了
//str屬于是野指針去訪問了一塊被銷毀的空間,因此會打印一些隨機值

改為:

int* test()
{int a = 10;return &a;//a的地址被存放在寄存器當中
}
int main()
{int* p = test();//p接收到a的地址printf("%d\n", *p);//p已經是野指針  打印10 因為調用test的棧空間還沒有被覆蓋printf("%d\n", *p);// 打印隨機值 有一次調用test函數,棧空間被新隨機值給覆蓋return 0;
}

另外,上面所說子函數動態申請內存給主函數用,主函數在使用完要釋放。釋放后最好置空,否則,其是個野指針,可能會導致錯誤。

4.3題目3:
void GetMemory(char** p, int num)
{assert(*p);*p = (char*)malloc(num);
}
void tset(void)
{char* str = NULL;GetMemory(&str, 100);strcpy(str, "hello");printf(str);//free釋放free(str);str = NULL;
}
int main()
{test();return 0;
}

改正:

void test(void)
{char* str = (char*)malloc(100);strcpy(str, "hello");free(str);//free釋放str = NULL;//置空if (str != NULL){strcpy(str, "world");printf(str);//無法打印}
}
int main()
{test();return 0;
}

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

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

相關文章

MatrixOne實戰系列回顧 | 導入導出項目場景實踐

本次分享主要介紹MatrixOne導入導出以及項目場景實踐。將從四個方向為大家演示MatrixOne的功能,分別是數據的導入、導出、對接數據集成工具,以及Java連接實戰。 數據導入會使用三種方式將數據導入至 MatrixOne中。分別是insert語句、load data語句還有s…

學習Opencv(蝴蝶書/C++)——3. OpenCV的數據類型

文章目錄 1. 總覽2. 基礎類型2.0 基礎類型總覽2.1 cv::Vec<>類2.2 cv::Matx<>類2.3 cv::Point類(cv::Point3_< >和cv::Point_< >)2.4 cv::Scalar(cv::Scalar_)類2.5 cv::Size(cv::Size_)類、cv::Rect(cv::Rect_)類和cv::RotatedRect 類2.6 基礎類型…

常見面試題-Redis 主從復制原理以及痛點

Redis 主從復制如何同步數據呢&#xff1f; 參考文章&#xff1a;https://blog.csdn.net/Seky_fei/article/details/106877329 https://zhuanlan.zhihu.com/p/55532249 https://cloud.tencent.com/developer/article/2063597 https://xie.infoq.cn/article/4cffee02a2a12c2…

LongAccumulator

原子操作之LongAccumulator 和LongAdder的區別在于&#xff0c;LongAdder是在Cell里面只能做加減操作&#xff0c;不能乘除&#xff0c;而LongAccumulator就可以定義乘除操作。原理和LongAdder都是一樣的&#xff0c;一個Base和一個Cells數組。 原文跳轉地址

pyqt5的組合式部件制作(四)

對組合式部件的制作又改進了一版&#xff0c;組合式部件的子部件不再需要單獨“提升為”&#xff0c;如果在模板文件的提升部件窗口內選擇了“全局包含”&#xff0c;那么只需要在模板文件和應用文件中直接復制粘貼即可&#xff0c;部件的應用更為簡便。如下圖&#xff1a;按住…

2023秋招上岸必備軟件測試面試題

1、請結合你熟悉的項目&#xff0c;介紹一下你是怎么做測試的&#xff1f; -首先要自己熟悉項目&#xff0c;熟悉項目的需求、項目組織架構、項目研發接口等 -功能 接口 自動化 性能 是怎么處理的&#xff1f; -第一步&#xff1a; 進行需求分析&#xff0c;需求評審&#…

【Delphi】開發IOS 程序,TLabel 中英文字對齊(水平),一行代碼解決顯示對齊問題!

目錄 一、問題現象&#xff1a; 二、解決方案&#xff08;一行代碼解決ios對齊問題&#xff09;&#xff1a; 三、解決后效果&#xff1a; 四、后記&#xff1a; 一、問題現象&#xff1a; 在用 Delphi 開發ios程序時&#xff0c;使用TLabel控件顯示&#xff0c;會出現中英…

WiFi 6的數據在發送端分片和在接收端重組的理解

802.11ax是WiFi 6標準&#xff0c;其引入了一些新的特性和技術來提升無線網絡的性能&#xff0c;其中包括幀聚合和幀分片。以下是它們的詳細處理流程&#xff1a; 1. 幀聚合 幀聚合是一種提高傳輸效率的技術&#xff0c;它允許多個數據幀被聚合到一起&#xff0c;然后作為一個…

layui(2.8.18)生成驗證碼

<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>登入</title><meta name"renderer" content"webkit"><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1&quo…

Go 工具鏈詳解(七):模塊緩存清理工具

go mod 緩存 在 Golang 中&#xff0c;模塊是對一組版本化的包的集合的描述。Go 1.11 版本引入了模塊支持&#xff0c;通過 go mod 命令提供了對模塊的管理。Go 模塊的一個重要特性是依賴管理&#xff0c;可以清晰地定義項目所依賴的模塊及對應的版本&#xff0c;并確保代碼使…

電磁優化的并行空間映射方法

空間映射(SM)是一種公認的加速電磁優化的方法。現有的SM方法大多基于順序計算機制。本文提出了一種用于電磁優化的并行SM方法。在該方法中&#xff0c;每次迭代開發的代理模型被訓練以同時匹配多個點的精細模型。多點訓練和SM使代理模型在比標準SM更大的鄰域內有效。本文提出的…

[補題記錄] Complete the Permutation(貪心、set)

URL&#xff1a;https://codeforces.com/group/OcmZ7weh45/contest/487583/problem/J 目錄 Problem/題意 Thought/思路 Code/代碼 Problem/題意 給出一個長度為 N 的序列&#xff0c;其中的元素都是奇數。 現在要求在兩個奇數之間插入一個偶數&#xff0c;使得這三個數遞增…

信息壓縮模型在自然語言處理中的應用和探討

信息壓縮模型在自然語言處理中的應用和探討 摘要:正文:結論:附錄:摘要: 隨著人工智能和深度學習的發展,自然語言處理(NLP)在信息處理中的角色變得越來越重要。然而,海量的自然語言數據為信息處理帶來了挑戰——更多的信息通常意味著更高的處理成本,并可能導致效率降低。為…

一個工具讓你明白“萬丈高樓平地起”,拒絕重復造輪子!

大家在公司工作當中是不是很多時間裝環境很麻煩&#xff0c;一個項目要上線了&#xff0c;開始網上搜了一邊又一遍的環境搭建教程&#xff1f;等到下一個項目要上線了&#xff0c;又上網上搜了一邊又一遍的環境搭建教程。關鍵天花亂墜的互聯網&#xff0c;找不到很靠譜的呀。有…

數組的移動

設計程序&#xff0c;給定包含N個整數的數組array&#xff0c;實現操作&#xff1a;前面各個整數順序向后移動m個位置&#xff0c;最后的m個整數移動到最前面。方法&#xff1a;void move(int array[], int n,int m ) 輸入要求 第一行輸入兩個整數N(1<N<1e6)和m(0<m&…

webpack 配置

1、基礎配置 // node js核心模塊 const path require(path) // 插件是需要引入使用的 const ESLintPlugin require(eslint-webpack-plugin) // 自動生成index.html const HtmlWebpackPlugin require(html-webpack-plugin); // 將css文件單獨打包&#xff0c;在index.html中…

如何做好項目管理?年薪百萬項目大佬一直在用這11張圖

大家好&#xff0c;我是老原。 日常工作中&#xff0c;我們會遇到各種大大小小的工作項目&#xff0c;如何能讓項目保質保量的完成&#xff0c;是我們項目經理的目標。 項目管理的流程可以說是由一系列的子過程組成的&#xff0c;它是一個循序漸進的過程&#xff0c;所以不能…

python數字

目錄 整數&#xff08;如&#xff0c;2、4、20 &#xff09;的類型是 int&#xff0c;帶小數&#xff08;如&#xff0c;5.0、1.6 &#xff09;的類型是 float。 Python 用 ** 運算符計算乘方 1&#xff1a; 等號&#xff08;&#xff09;用于給變量賦值。 解釋器像一個簡單…

進程API

linux下進程的api forkwaitexec fork #include <stdio.h> #include <stdlib.h> #include <unistd.h>/* linux環境運行 子進程并不是完全拷貝了父進程。具體來說&#xff0c;雖然它擁有自己的 地址空間&#xff08;即擁有自己的私有內存&#xff09;、寄存器…