1. 程式人生 > >關於C語言中返回區域性變數和區域性指標變數

關於C語言中返回區域性變數和區域性指標變數

char *test1(void)

{

char b[10] = "abcde";

return b;

}

char *test1_ver2(void)

{

static char b[10] = "abcde";

return b;

}

char *test2(void)

{

char c[10] = "abcde";

char *pStr = c;

return pStr;

}

char *test3(void)

{

char *c = "abcdef";

return c;

}

test1不能執行,甚至可能無法編譯通過;因為char b[10] 是區域性變數,其存放在棧上,在函式執行完成就會被釋放。而返回它存放的地址,此時已經是可能是個非法地址。

test1_ver2可以正確執行,在test1中,我們說test1不能執行或出現編譯錯誤的原因是 b[]陣列在函式執行結束後會被釋放,如果我們再對其存放空間進行訪問就會出錯,此時我們定義static char b[10]; 將其存放在靜態儲存區,只有在程式執行結束後才會被系統回收,即使退出該函式,b[]陣列存放的靜態儲存區始終存在,所以,我們再對其進行訪問,不會出現錯誤

test2可以執行。c[10]和*pStr均儲存在棧中;該函式返回值是儲存在pStr指標中的c陣列在棧中的存放地址,當呼叫該函式時,該地址被複制到外部的指標變數中,然後,儲存在棧上的c[]陣列和pStr指標的記憶體空間被釋放。c[]陣列的存放地址是被傳送出去了的,但是,由於c[]是區域性變數, 在函式執行完成後,存放的記憶體空間就被釋放,所以,在外部通過指標訪問c[]陣列時,指向的記憶體空間無效,而且還可能出現訪問非法記憶體的危險。雖然這樣能夠執行,但是沒有實際效果

test3可以執行。*c指標c是儲存在棧中,"abcdef"字串儲存在文字常量區,其存放空間,直到程式執行結束才會被系統回收。所以,返回它的地址是一個實際存在的有效地址。

相關推薦

關於C語言返回區域性變數區域性指標變數

char *test1(void) { char b[10] = "abcde"; return b; } char *test1_ver2(void) { static char b[10] = "abcde"; return b; } char *test2(voi

關於C語言返回區域性指標變數

前言 寫這篇文章,是因為同學在leetcode上遇到了這樣一個錯誤: - 題目:Two Sum - 程式碼如下: int* twoSum(int* nums, int numsSize, int target) { int i,j; in

C語言無符號數有符號數相加比較的問題

轉自https://blog.csdn.net/supreme42/article/details/6687781 看個題: #include<stdio.h> int main() { unsigned int a=6; int b=-20; printf("%d\n"

C語言的淺拷貝深拷貝

淺拷貝 首先看下面這段程式碼: # include<assert.h> # include<string.h> #include <stdlib.h> typedef struct Node//定義了一個結構體 { int size; char *da

C語言的隨機數 srand ( ) rand ( )

在C語言中,生成一個隨機數,一般利用兩個函式,即void srand ( unsigned int seed ) 和 int rand ( void )。     srand() 函式用於生成一個隨機數種子,種子的值等於引數seed,這個引數由我們指定一個

C語言的單引號雙引號的區別

  首先肯定地說,二者是有區別的,不是說用誰都一樣。 1、實質區別,代表的含義不同 'A'代表的是一個整數,而且這個整數對應的是編譯器所採用的字符集中的字元序列對應的數值。所以'A'跟ASCII中的65意義是相同的。 1 # include <iostream>

C語言宣告、定義初始化的區別

函式和變數(全域性變數)都有宣告和定義, 對於函式而言: 同一檔案內,如果函式fun_1呼叫fun_2時,如果fun_2在fun_1之後定義,則需在fun_1之前對fun_2進行宣告,如下: void fun_2();// 宣告 void fun_1() { ... fu

C 語言的結構體共用體(聯合體)

本文主要總結了譚浩強主編的《C 程式設計》教材中結構體和共用體相關章節的內容。 在 C 語言中, 結構體(struct) 是一個或多個變數的集合,這些變數可能為不同的型別,為了處理的方便而將這些變數組織在一個名字之下。由於結構體將一組相關變數看作一個單元而不是各自獨立的實體,因此結構體有助於組織複雜的資料,

C語言返回字串函式的四種實現方法

其實就是要返回一個有效的指標,尾部變數退出後就無效了。 使用分配的記憶體,地址是有效 char   *fun() {         char*   s   =   (char*)calloc(100,   sizeof(char*)   );         if   (s)                

C語言棧的建立應用

棧的特點為: 先進後出(first in last out)。 棧中有兩個指標,棧頂指標和棧尾指標。其中,棧尾指標是不動的。用棧頂指標等於棧尾指標來判定棧是否為空。壓棧時,將棧頂指標+1,然後將資料存

C語言樹的建立遍歷

樹的遍歷分為三種:前序遍歷(根左右),中序遍歷(左根右),後序遍歷(左右根)。 PS:根左右,就是先遍歷根節點,然後是左子樹,最後是右子樹。如下圖: 前序遍歷:ABDECF。 中序遍歷:DBEACF

C語言的子函式主函式有什麼聯絡啊?它們是怎麼編寫的?

函式定義的一般形式1.無參函式的一般形式 型別說明符 函式名() { 型別說明 語句 }  其中型別說明符和函式名稱為函式頭。 型別說明符指明瞭本函式的型別,函式的型別實際上是函式返回值的型別。 該型別說明符與第二章介紹的各種說明符相同。 函式名是由使用者定義的識別符號,函式名後有一個空括號,其中無引數,但括

C++類成員變數成員指標變數小結

指標的確有點難理解,不過它之所以存在並大範圍使用,這樣做是有一定道理的。 一、C++中的類和結構使用指標定義成員作用 1、多型的要求。 如果要使用同一介面,多型設計,那麼就一定要使用基類指標。只有指標才能在實力化後動態的判斷使用哪個方法。2、程式碼複用。有一些程式要設計

C語言各資料型別他們對應的最大值最小值的常量

C中各種型別的最大值最小值常量定義在”limits.h”和”float.h”中。 CHAR_MIN和CHAR_MAX分別表示有符號小整型的最小值和最大值,UCHAR_MAX表示無符號小整型的最大值; SHRT_MIN和SHRT_MAX分別表示有符號短整型的最

C語言的語法錯誤語義錯誤

語法錯誤 1:如果不遵循C語言的規則就會犯語法錯誤,它類似於英語中的語法錯誤。 例如(Bugs frustrate be can)這句英語    可以看出句子中的英語單詞都是正確的,但是沒有按照正確的順序組織句子。c的語法錯誤就是指正確的c符號放在了錯誤的位置。  那麼如何

C語言區域性變數全域性變數變數的儲存類別(static,extern,auto,register)

C語言中區域性變數和全域性變數變數的儲存類別(static,extern,auto,register) 1----區域性變數和全域性變數 在討論函式的形參變數時曾經提到,形參變數只在被呼叫期間才分配記憶體單元,呼叫結束立即釋放。這一點表明形參變數只有在函式內才是有效的,離開該函式就不能再使用了。

C語言區域性變數全域性變數解釋

區域性變數 :   在一個函式內部定義的變數是區域性變數,它只在本函式範圍內有效,也就是說只有在本函式內才能使 用它,在此函式外是不能使用這些變數的。這些稱為區域性變數。   說明     (1)  不同函式中可以使用相同名字的變數,它們代表不同的變數,互不干擾。   

C語言函式的思考(可以返回區域性變數嗎)

 一般的來說,函式是可以返回區域性變數的。 區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及地址,程式不會出錯。但是如果返回的是區域性變數的地址(指標)的話,程式執行後會出錯。因為函式只是把指標複製後返

c語言全域性變數區域性變數問題彙總(轉)

1、區域性變數能否和全域性變數重名? 答:能,區域性會遮蔽全域性。要用全域性變數,需要使用"::" 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同一個函式內可以定義多個同名的區域性變數,比如在兩

C/C++語言變數作用域:區域性變數,全域性變數,檔案級變數

C/C++語言中的變數分為全域性變數和區域性變數。這種劃分方式的依據是變數的可見範圍或者叫做作用域。 1 區域性變數 區域性變數指的是定義在{}中的變數,其作用域也在這個範圍內。雖然常見的區域性變數都是定義在函式體內的,也完全可以人為的增加一對大括號來限定變