【c語言】重溫一下動態內存,int數組過大會造成棧錯誤

項目場景:

項目場景:互助群同學在刷題的過程中,遇到的一個題目,需要申請一個很大數組,于是這個同學就寫了int[1000000],其實這樣寫也沒有錯,可是運行后卻顯示棧錯誤。于是就找到我來請教,我想就這個問題延申一下,在談談棧空間,堆空間等。
刷題原題


問題描述

#include<stdio.h>
int main()
{int n,s[1000000],max,min,i,j;long long int sum;double g;scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&s[i]);}max=s[1];min=s[0];sum=s[0]+s[1];if(s[0]>s[1]){max=s[0];min=s[1];}for(j=2;j<n;j++){if(s[j]>max)max=s[j];if(s[j]<min)min=s[j];sum=sum+s[j];g=1.0*(sum-max-min)/(j-1);printf("%.2lf",g);}return 0;
}

這里拋開邏輯不談,在申請int s[1000000]時,就可能導致越棧空間的問題。許多初學者可能分不太清臨時數組和動態數組的區別,所以會一直以來使用int s[1024]這種申請數組的形式,但是一旦申請的內存大就會出問題,這里題目要求10的6次方,就是考察你是否會使用動態申請內存。

解決方案:

我直接給出動態申請內存的代碼,這不是我想講的重點。重點放在原因分析

#include <stdio.h>
#include <stdlib.h>int main() {int* arr = (int*)malloc(1000000 * sizeof(int));if (arr == NULL) {printf("內存分配失敗\n");return 1;}// 現在你可以使用 arr 指針來操作這個動態分配的數組// 例如,給數組賦值for (int i = 0; i < 1000000; i++) {arr[i] = i;}// 打印數組中的值for (int i = 0; i < 1000000; i += 100000) {printf("%d ", arr[i]);}printf("\n");// 釋放動態分配的內存free(arr);return 0;
}

原因分析:

計算機的棧空間和堆空間是兩種不同的內存分配區域,它們在內存管理和使用方式上有一些重要的區別。

找到一張博主的圖很不錯轉載:http://t.csdnimg.cn/jvgKJ這個博文講的會很詳細,我就不講那么細了
在這里插入圖片描述
先看一下兩個地址的區別
棧空間(Stack):
棧空間是一種靜態內存分配,由編譯器自動分配和釋放。
棧空間主要用于存儲函數的局部變量、函數參數、函數調用的返回地址等。
棧空間的大小是固定的,通常比堆空間小,而且通常不需要手動管理。
棧空間的分配和釋放是自動的,遵循“先進后出”的原則,即最后進入的數據最先出來。

堆空間(Heap):
堆空間是一種動態內存分配,需要手動分配和釋放。
堆空間主要用于存儲動態分配的內存,例如使用 malloc、new 等函數分配的內存。
堆空間的大小不固定,通常比棧空間大,需要手動管理分配和釋放。
堆空間的分配和釋放需要程序員手動控制,如果沒有正確釋放分配的內存,可能會導致內存泄漏等問題。

讀完之后,你要知道int s[100000]就是在棧空間上找個這么多個連續的int內存準備好給你用,看圖上Stack有個小箭頭,代表內存向下生長,也就是說你一直無止盡的申請內存,就會往下跑,一旦跑到Memory區域,就會報錯,告訴你,我沒有內存可以申請使用了(Stack區域是比較小的,比heap小很多)。

講個題外話,很早以前Stack是向上生長的,一旦到達kernel區域,就是計算機的底層核心代碼區域,就可以對地址進行操作,達到控制計算機的目的,黑客也就是這么做的。

所以這個題目需要申請10的6次方,我們需要申請動態內存,而且這一塊內存可以反復利用,一旦之前申請的內存free了,再次申請時,這一塊內存就可以再度利用了。

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

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

相關文章

從零開始的c語言日記day36——指針進階

一、什么是指針: 指針的概念:1.指針就是個變量&#xff0c;用來存放地址&#xff0c;地址唯一標識一塊內存空間。 ⒉指針的大小是固定的4/8個字節(32位平臺/64位平臺)。 指針是有類型&#xff0c;指針的類型決定了指針的-整數的步長&#xff0c;指針解引用操作的時候的權限。…

嵌入式面經-python相關問題

1、c\cpp\python 區別&#xff0c;各自優缺點&#xff1f; 2、python是怎么處理 深拷貝和淺拷貝的&#xff1f; 3、python的多線程 多進程 4、用過python哪些庫

玻璃加工ERP包含些模塊?玻璃加工ERP好用嗎

玻璃制品的類型多、規格不一、營銷策略靈活、銷售渠道廣泛、生產關聯業務環節。在當今這個市場競爭日益激烈的時代&#xff0c;如何有效整合各個業務環節&#xff0c;提升多部門協作效率&#xff0c;隨時進行數據分析等&#xff0c;是每個玻璃加工企業面臨的管理難題。 在數字…

【C語法學習】27 - 字符串轉換為數字

文章目錄 1 atoi()函數1.1 函數原型1.2 參數1.3 返回值1.4 轉換機制1.5 示例1.5.1 示例1 1 atoi()函數 1.1 函數原型 atoi()&#xff1a;將str指向的字符串轉換為整數&#xff0c;函數原型如下&#xff1a; int atoi(const char *str);1.2 參數 atoi()函數只有一個參數str&…

docker部署paddleocr

內容僅供參考學習 歡迎朋友們V一起交流&#xff1a; zcxl7_7 環境 1. CentOS7 ?2. docker ?3. PaddleOCR2.5.2 1.準備 1. 首先準備好需要打包的項目 2. 在該項目中創建Dockerfile文件 touch Dockerfile2. 編寫Dockerfile # 從Python 3.8的官方鏡像中創建(pyt…

建立簡單的客戶端-服務端通信系統

本文介紹如何使用C編寫一個基本的客戶端-服務端通信系統。通過這個例子&#xff0c;你將學到如何建立TCP連接、發送和接收消息&#xff0c;以及如何處理多個客戶端連接。 客戶端代碼&#xff1a; #include <stdio.h> // 標準輸入輸出庫&#xff0c;提供基本的輸入…

matlab使用scatter函數畫圖時報錯“數組索引必須為正整數或邏輯值”解決辦法

一、背景 在使用matlab的scatter函數畫圖時報錯“數組索引必須為正整數或邏輯值”。 scatter函數說明&#xff1a;scatter(x,y) 在向量 x 和 y 指定的位置創建一個包含圓形標記的散點圖。 二、解決辦法 如果使用scatter函數時報上述錯誤&#xff0c;嘗試將連續函數先轉換為函…

ubuntu編譯sqlite3并使用

SQLite3是一種輕量級的關系型數據庫管理系統&#xff0c;它是在C語言基礎上實現的。SQLite3具有許多優點&#xff0c;例如&#xff1a; 1.靈活&#xff1a;它可以在多種操作系統上運行&#xff0c;并且可以將多個數據庫文件合并成一個文件。 2.易于使用&#xff1a;SQLite3使用…

基于爬行動物算法優化概率神經網絡PNN的分類預測 - 附代碼

基于爬行動物算法優化概率神經網絡PNN的分類預測 - 附代碼 文章目錄 基于爬行動物算法優化概率神經網絡PNN的分類預測 - 附代碼1.PNN網絡概述2.變壓器故障診街系統相關背景2.1 模型建立 3.基于爬行動物優化的PNN網絡5.測試結果6.參考文獻7.Matlab代碼 摘要&#xff1a;針對PNN神…

八股文面試day6

什么是代理&#xff1f;為什么要用動態代理&#xff1f; 代理模式大概意思是&#xff1a;為其他對象提供一個代理項或者是占位符&#xff0c;以控制對這個對象的訪問 代理模式核心思想&#xff1a;創建一個代理對象&#xff0c;在客戶端和目標對象之間的一個中介&#xff0c;…

35的程序員被辭了可以自己接外包啊?為什么都那么悲觀呢?

35的年紀&#xff0c;上有老下有小&#xff0c;即將步入中年危機&#xff0c;在這個節骨眼上被辭&#xff0c;能不悲觀嗎&#xff1f; 在這個年紀人們往往追求的是穩定的工作和生活&#xff0c;而進入一個自己不熟悉的行業并不是一個好的選擇。 況且&#xff0c;你認為的外包…

診斷0x27服務解密文件DLL制作與使用

DLL文件在CANoe的使用方法 DLL文件在診斷里面可以用在0x27秘鑰服務里面&#xff0c;對解密有幫助&#xff0c;在下圖位置加載。 DLL文件制作 vector公司本來就給了我們一個demo&#xff0c;先拷貝一份下來&#xff0c;別把原來的文件給改壞了。我這個是CANoe12&#xff0c;de…

Visio給立方體的每條邊填充不同的顏色,超好用的visio小技巧~

Visio給立方體的每條邊填充不同的顏色&#xff0c;超好用的visio小技巧~ 如何實現立方體的填充顏色從左邊的純色到右邊的多色呢&#xff1f;一起學起來吧~ 在visio中繪制一個普通的立方體&#xff1b; 用一個大的矩形蓋住剛才繪制的立方體&#xff1b; 全選之后找到 開發工具-&…

matplotlib

設置中文字體&#xff0c;圖片大小&#xff0c;分辨率&#xff0c;中文負號 符號 x軸和y軸 設置x軸和y軸的刻度 字體大小 線條樣式 繪制多個線條 圖例 顯示每個坐標值 gca 分辨率 畫布尺寸 創建圖形對象 不能直接使用區域對象作畫 繪制多子圖 均等的劃分畫布 柱狀圖 同一位置多…

Python 讀取2進制bin文件

pip下載hexdump pip install hexdump讀取bin文件 python -m hexdump xxx.bin

HTTP/HTTPS

HTTP/HTTPS 簡介 HTTP 協議是 Hyper Text Transfer Protocol&#xff08;超文本傳輸協議&#xff09;的縮寫&#xff0c;是用于從萬維網&#xff08; WWW:World Wide Web &#xff09;服務器傳輸超文本到本地瀏覽器的傳送協議。 HTTP 是一個基于 TCP/IP 通信協議來傳遞數據&a…

最新版車牌號正則效驗

支持最新版新能源、各類特種車等車牌號規則效驗 private static final Pattern pattern Pattern.compile("^([京津滬渝冀豫云遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陜吉閩貴粵青藏川寧瓊使領A-Z]{1}[a-zA-Z](([京津滬渝冀豫云遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陜吉閩貴粵青藏川寧瓊AB…

類加載過程

Java類加載過程包括加載&#xff08;Loading&#xff09;、驗證&#xff08;Verification&#xff09;、準備&#xff08;Preparation&#xff09;、解析&#xff08;Resolution&#xff09;、初始化&#xff08;Initialization&#xff09;五個階段。這些階段是按照順序逐步執…

Javascript中的宏任務與微任務

事件循環 JavaScript 語言的一大特點就是單線程&#xff0c;也就是說&#xff0c;同一個時間只能做一件事。為了協調事件、用戶交互、腳本、UI 渲染和網絡處理等行為&#xff0c;防止主線程的不阻塞&#xff0c;Event Loop 的方案應用而生。Event Loop 包含兩類&#xff1a;一…

購買Zoho CRM系統要花多少錢?

相信對CRM系統有過了解的人都知道&#xff0c;CRM系統的價格取決于功能需求&#xff0c;用戶數量&#xff0c;部署方式&#xff0c;定制開發等因素。Zoho CRM是全球領先的云CRM系統&#xff0c;自2005年推出以來&#xff0c;累計服務25萬企業&#xff0c;那么Zoho CRM系統的價格…