1. 程式人生 > >函式內返回字元陣列和字元指標的問題

函式內返回字元陣列和字元指標的問題

// 1

#include<stdio.h>

char *arrstr()

{

         char arr[]="Hello World !";

         return arr;

}

int main()

{

        char  *str=arrstr();

        printf("%s",str);

}

// 2

#include<stdio.h>

char *arrstr()

{

         char *p="Hello World !";

         return p;

}

int main()

{

        char  *str=arrstr();

        printf("%s",str);

}

結果: 1  輸出為亂碼  2  輸出 Hello World!

1、"hello world!"是一個字串常量,存放在靜態資料區,沒錯,但是把一個字串常量賦值給了一個區域性變數(char []型陣列),該區域性變數存放在棧中,這樣就有兩塊內容一樣的記憶體,也就是說“char p[]="hello world!";”這條語句讓“hello world!”這個字串在記憶體中有兩份拷貝,一份在動態分配的棧中,另一份在靜態儲存區。當arrstr函式退出時,棧要清空,區域性變數的記憶體也被清空了所以這時的函式返回的是一個已被釋放的記憶體地

址,所以打印出來的是亂碼。

2、把字串所在靜態儲存區的首地址賦給指標p , 當函式退出時,字串常量所佔記憶體不會被收回,所以能夠順利訪問訪問


相關推薦

函式返回字元陣列字元指標的問題

// 1 #include<stdio.h> char *arrstr() {          char arr[]="Hello World !";          return arr; } int main() {         char  *str

字元陣列字串指標區別

 用字元陣列和字元指標變數都可實現字串的儲存和運算。但是兩者是有區別的。在使用時應注意以下幾個問題: 1.     字串指標變數本身是一個變數,用於存放字串的首地址。而字串本身是存放在以該首地址為首的一塊連續的記憶體空間中並以‘\0’作為串的結束。字元陣列是由於若干個陣列元

c語言用字元陣列字元指標刪除相同字元

如何用字元陣列和字元指標做引數刪除與某字元相同的字元 1.用字元陣列 char *DelLetter1(char str1[],char a) //用字元陣列刪除 { int i = 0; int c = 0; char *b = (char*)malloc((s

C語言中字元陣列字串指標分析

    這幾天搞Unix上的C程式,裡面用到了很多字元陣列和字串指標,我記得在學完C語言後相當一段時間裡,對指標這個東西還是模模糊糊,後來工作也沒怎麼用到過C,雖然網上這類的文章也有很多,還是決定自己在這做個小總結,也算加深下自己的印象,寫了下面的測試程式: #include <stdio.h>

字元陣列字串指標的區別

字元陣列和字串指標都可以用來儲存字串。除了形式上的區別,相差不大!給出一段程式碼#include<iostream> using namespace std; int main() { char a[10]="Hello!"; char *b="w

c語言的字元陣列字元指標

   這幾天搞Unix上的C程式,裡面用到了很多字元陣列和字串指標,我記得在學完C語言後相當一段時間裡,對指標這個東西還是模模糊糊,後來工作也沒怎麼用到過C,雖然網上這類的文章也有很多,還是決定自己在這做個小總結,也算加深下自己的印象,寫了下面的測試程式: #inclu

函式 宣告一個字元陣列一個指向字串陣列指標 區別

函式內 宣告一個字元陣列: char* Fuction()...{    char a[]="abcdefg";//存取在棧中return a;                  //返回指向“棧記憶體”的指正,VC6.0發出warning} 函式內宣告一個指向字串陣列

記憶體的堆分配棧分配 & 字元陣列字元指標,Sizeof總結

文章轉載自:http://blog.csdn.net/SomnusLee1988/article/details/17251049 堆和棧的區別 一個由C/C++編譯的程式佔用的記憶體分為以下幾個部分1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,

C/C++中字元指標字元陣列字元指標陣列及指向指標指標的含義

字元指標和字元陣列 char* s1="hello"; char  s2[]="world";兩個表示式的含義是一樣的.如果講不同之處的話,VC6中編譯時,對這兩種定義進行了不同的處理;char *s1 = "hello"; 中的"hello",編譯時指標指向的區域位於PE

c/c++ 字元陣列字元指標字串型別

一、字元陣列 定義:用來存放字元資料的陣列是字元陣列,字元陣列中的一個元素存放一個字元。字元陣列具有陣列的共同屬性。 初始化方式: 1 charc[10]={'0','1','2','3','4','5','6','7','8','9'}; 注:當初值個數小於規定長度

字元、字串、字元陣列、字串指標變數

字元和字串的區別 字元 如下,定義char,每一個字元一般情況下佔用8個位元組。 char c, ch; 字串 例如"helloworld"; 注意' '和" "的區別,後者為常量字串 在C++中,有兩種型別的字串表示形式: C-風格字

java新手:字串陣列字元陣列字串之間的轉換

(1)字串和字元陣列的轉化 // 字串轉化成字元陣列 String str = "abcdefg"; char[] ch = str.toCharArray(); //輸出a System.out.println(ch[0]); //字元陣列

javascript 整數型陣列字元陣列相互轉換

需求背景: 需要將 a = [1,2,3,4,5] 轉換成  a = ['1','2','3','4','5'](整數型陣列轉換成字元型沒找到直接的方法,思路就是先將陣列轉換成字串,然後再將字串轉換成陣列)   然後有的需求是需要將 ['1','2','3','4','5'] 轉換成

【字串】字元陣列字串區別詳解

C 語言中並不存在字串這個資料型別,而是使用字元陣列來儲存字串。那麼,字元陣列就一定是字串嗎? 對於這個問題,大多教科書中的回答是“是”。其實不然,字元陣列和字串是完全不相同的兩個概念,千萬不要混淆。分析如下所示的示例程式碼。 1 #include <stdio.h> 2 #incl

總結字元陣列字串的輸入

文章目錄 寫在前面 字元陣列 字串 寫在前面 有時候,字串和字元陣列的輸入容易造成一些奇怪的錯誤 這裡總結一下 字元陣列 經常用的,就是s

字元陣列字串的區別聯絡

字串和字元陣列的區別和聯絡: C語言中沒有用於表示字串的關鍵字以陣列形式將字串輸出 字串和字元陣列的區別和聯絡:C語言中沒有一個用於表示字串的關鍵字c語言的字串由C的字元陣列變形而成,末尾加上'\0'字串比字元陣列多一個'\0' 聯絡:都是一陣列形式儲存資料,字元之間地址連

在結構中使用字元陣列還是字元指標

宣告一個數組有三種方法: 宣告一個數組,宣告時用常量表達式指定陣列維數宣告一個變長陣列,宣告時用變量表達式指定陣列位數(C99以後)宣告一個指標,呼叫malloc()分配合適的記憶體使用第二種和第三中

位元組陣列字元之間互換

定義string變數為str,記憶體流變數為ms,位元陣列為bt       1.字串轉位元陣列 (1)byte[] bt=System.Text.Encoding.Default.GetBytes("字串"); (2)byte[] bt=Convert.FromB

C語言 字元陣列字元指標比較

#include<stdio.h> /*   字元陣列會在定以後預先分配記憶體空間字串是常量所以會直接把字串拷貝到陣列中,   因為陣列地址不同,所以不相等·   字元指標不會預先分配記憶體空間,直接指向字串常量,所以地址相同.  */ void compare

字元陣列字元指標,Sizeof總結

Sizeof與字串 1.以字串形式出現的,編譯器都會為該字串自動新增一個0作為結束符,如在程式碼中寫   "abc",那麼編譯器幫你儲存的是"abc/0" 2."abc"是常量嗎?答案是有時是,有時不是。   不是常量的情況:"abc"作為字元陣列初始值的時候就不是,如