TEL:400-8793-956
當前位置:程序、服務器

全局和局部變量聲明之間的區別

提問者: 近期獲贊: 瀏覽人數: 發布時間:2020-12-20 15:28:13

 問:在我的項目工作期間,我正在編寫一個代碼,該代碼在初始化兩個float數據類型的變量時遇到分段錯誤,這兩個變量的維數在1000和1800之間均為1800,但是當我聲明全局變量時,程序可以正常工作。您能告訴我為什么會這樣嗎,在本地或全局聲明變量時如何為變量分配內存是它們的大小限制。我在下面附上兩個小程序,其中在全局和本地聲明了變量,請看一看。

 
第一程序
#include  “ stdio.h”
#include  “ string.h”
float arr [ 1000 ] [ 1800 ];
float vrr [ 1000 ] [ 1800 ];
int  main ()
{
      memset ( arr ,0 ,sizeof ( arr ));
      memset ( vrr ,0 ,sizeof ( vrr ));
      返回 0 ;
}
第二程序
#include  “ stdio.h”
#include  “ string.h”
int  main ()
{
      float arr [ 1000 ] [ 1800 ];
      float vrr [ 1000 ] [ 1800 ];
      memset ( arr ,0 ,sizeof ( arr ));
      memset ( vrr ,0 ,sizeof ( vrr ));
      返回 0 ;
}
請用尖括號將雙引號替換,否則檢查所附 程序。
 
 
答:在C語言中,局部變量是在堆棧中分配的內存,而全局數據則不保存在堆棧中。將本地聲明的變量保留在堆棧中的主要原因是防止惡意腳本不必要地占用內存空間。
 
由于全局數據未存儲在堆棧中,因此可以聲明“ arr [1000] [1800]”,如果有足夠的可用內存,則會為它分配內存空間。但是,如果您嘗試在函數中執行相同的操作,則堆棧大小限制(取決于平臺,通常約為8 mb)不會使您的陣列獲得所需的內存,從而導致“分段錯誤”。
 
擺脫這種情況的一種方法是增加堆棧限制,您可以通過在shell中執行以下命令來做到這一點:
ulimit -s 500000 #ie(將您的堆棧限制更改為大約500 mb或根據您的要求)
,希望這可以解決您的疑問。
 
 
答:首先讓我指定什么是全局變量和局部變量
 
全局變量定義一個固定大小的空間塊。當程序啟動時(執行操作的一部分),該空間分配一次,并且永遠不會釋放。
當輸入包含聲明的復合語句時,將分配局部變量的空間,并在執行該復合語句時釋放該空間。
對于局部變量:
在函數內部定義的變量分配在堆棧上。這意味著當函數退出時,相關的內存被清理(堆棧被“彈出”)。
 
對于全局變量:
在全局范圍內定義的變量分配在整個過程的生命周期中存在的數據段(或通常是從操作系統請求的內存空間)中。
 
另外
 
使用malloc分配的內存是從堆中分配的,并保持分配狀態,直到使用free明確釋放為止。
 
請注意,現代OS可以很好地提供程序請求的地址空間,但在物理上訪問內存(或內存的一部分,通常稱為頁面)之前,不將其物理地返回RAM。
上一篇: 如何在網頁上添加計時器
下一篇: 網站上面怎么加視頻
城市網站導航:無錫網站建設 徐州企業網站定制 常州網站開發哪家好 蘇州網站改版 南通網站開發 連云港網站建設 淮安網站建設公司 鹽城網站定制 揚州網站改版公司 鎮江網站開發 泰州高端網站制作 宿遷高端網站開發 江陰高端網站開發 宜興建設網站 新沂建設網站 邳州建設網站 常熟建設網站 張家港網站改版 昆山公司網站開發 太倉高端網站制作 丹陽高端網站制作 句容專業建站 泰興網站制作公司 合肥網站建設 蕪湖網站制作 蚌埠網站建設 淮南網站制作哪家好 馬鞍山網站建設 銅陵網站制作公司 安慶網站建設公司 黃山網站制作 滁州網站建設 阜陽網站設計 六安網站建設 亳州網站制作 宣城網站建設 巢湖網站建設哪家好 桐城網站制作 天長網站建設 明光網站建設 全椒網站建設 揚中網站建設公司 城市小程序導航:
彩票平台软件8 广东时时彩历史开奖记录查询结果 mba和mpacc考试科目 免费棋牌游戏现金下载 美女真人游戏—官方网址 彩票平台靠什么赚钱 江苏快3走势图冷号查询 安徽时时彩开奖号 五分彩骗局步骤图 足彩比分推荐最准的 如何在官网购买泰达币 四人麻将免费下载 中国足球彩票网 浙江快乐彩网上在那投注 极速快乐十分是啥意思 云南11选5开奘结果 中国竟彩澳客网