2010-04-19 111 views
1

可能這是一個嘶嘶聲問題,但請大家幫忙轉換的char []到char *

void Temp1::caller() 
{ 
char *cc=Called(); 
printf("sdfasfasfas"); 
printf("%s",cc); 
} 

char *Temp1::Called() 
{ 
char a[6]="Hello"; 
return &a; 
} 

這裏怎麼用printf打印你好( 「%S」,CC);

回答

0

2東西

  • 你需要%S,字符串格式說明打印字符串。

  • 您正在返回本地數組變量a [6]的地址,它將在函數返回後被銷燬。該程序應該給你一個分段錯誤。你應該會崩潰。如果你在一臺linux機器上執行ulimit -c unlimited,然後運行該程序。你應該看到一個核心轉儲。

+0

我就給%唯一的而且沒有工作 – Sijith 2010-04-19 09:08:22

+0

你能對你正在努力學習有什麼用細說。也許我們可以幫助更好,如果我們知道這一點,謝謝 – Jasmeet 2010-04-19 09:17:41

1

您正在返回局部變量,它利用未定義行爲的地址。您需要在Called或全局內部製作astatic,或爲其分配內存。

而且使用%s作爲格式printf

4

首先,這個功能:

char *Temp1::Called() 
{ 
char a[6]="Hello"; 
return &a; 
} 

返回一個局部變量,這將不復存在一旦函數結束 - 更改爲:

const char *Temp1::Called() 
{ 
return "Hello"; 
} 

然後,使用printf()打印字符串的方法是使用「%s」:

void Temp1::caller() 
{ 
const char *cc=Called(); 
printf("sdfasfasfas"); 
printf("%s",cc); 
} 
+1

在這種情況下,指針應該是'const char *'(避免不建議使用的轉換)。 – visitor 2010-04-19 10:25:23

+0

@visitor好點 - 改變了。 – 2010-04-19 12:48:28

0

%c用於打印單個字符。您需要使用%s來打印以空字符結尾的字符串。也就是說,當您嘗試從函數Called返回本地變量a的地址時,此代碼可能會崩潰。一旦返回Called,此可變內存就會被釋放。你試圖使用這個釋放的內存是Caller,並且在大多數情況下它會崩潰。

0

幾件事情:

  • 變化return &a;return a;
  • 您在返回 local陣列將不復存在 一次函數的地址分配return..so它 使用動態new或使其成爲static
  • 使用%s格式說明在printf到位%c
+0

我改變了也是同樣的情況。 代碼破解 – Sijith 2010-04-19 09:16:36

+0

通過添加所做的更改以及所看到的錯誤/崩潰來更新帖子。 – codaddict 2010-04-19 09:19:39

0

問題1的:%c是一個字符指定器,當你需要使用%s,這是格式說明字符串(指向NUL終止的字符數組的指針)。

問題2:在調用要返回一個指針的指針爲char(一個char **):一個本身被認爲是一個指針數組的第一個元素,因此你不在回報中需要用&符號。

問題3:即使你糾正其他兩個錯誤,有一個在你的代碼的一個重大缺陷:你試圖返回一個指向本地對象(數組一個),這會當它將超出範圍(例如,當被調用將返回時)被銷燬。因此,調用者將有一個指向不再專用於某個區域的內存區域;接下來會發生什麼是未定義的行爲:它可能會工作一段時間,直到存儲空間不存在於其他存儲器中(例如,如果在使用返回值之前不調用其他函數),但大多數在應用程序的第一次更改中可能會不幸爆炸。

在C中返回字符串的正確方法是用malloc或calloc在堆上分配它們,並將此指針返回給調用者,當它不再需要時,它將有責任釋放它。在C語言中執行此操作的另一種常見方式是將局部變量聲明爲靜態變量,因此它不會在返回時被破壞,但這會使您的函數不可重入且不會線程安全(並且還可能會導致其他難題)。另一方面,由於您使用的是C++,處理字符串的最佳方式是std::string class,它具有很好的複製語義,因此您可以將其作爲正常返回值返回,而不會打擾範圍考慮因素。

順便說一句,如果你需要返回的字符串總是相同的,你可以聲明你的函數的返回類型爲const char *,並直接返回字符串,如

const char * Test() 
{ 
    return "Test"; 
} 

這工作,因爲字符串「Test」被編譯器放在一個固定的內存位置,在所有的執行過程中它將停留在那裏。它需要是const char *,因爲編譯器可以對所有需要「Test」字符串的程序進行說明,並且因爲應用程序的所有字符串都緊密排列在那裏,所以如果您試圖使該字符串的長度會覆蓋其他字符串。

在我看來,如果你正在犯這樣的錯誤,那可能是因爲你現在的技能有點過於複雜:如果再看看你的情況可能會更好C++手冊,特別是關於指針和字符串的章節。

1

char a [6]是一個局部變量,你不能從函數返回它。當代碼超出範圍時,它將被銷燬。

您可以使用STL FOT這樣的:

#include <stdio.h>                                    
#include <string>                                    
using namespace std;                                  
string Called()                                    
{                                       
    string a=string("Hello");                                
    return a;                                    
}                                       

int main()                                     
{                                       
    string cc=Called();                                  
    printf("sdfasfasfas\n");                                
    printf("%s",cc.c_str());                                
}