可能這是一個嘶嘶聲問題,但請大家幫忙轉換的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);
可能這是一個嘶嘶聲問題,但請大家幫忙轉換的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);
2東西
你需要%S,字符串格式說明打印字符串。
您正在返回本地數組變量a [6]的地址,它將在函數返回後被銷燬。該程序應該給你一個分段錯誤。你應該會崩潰。如果你在一臺linux機器上執行ulimit -c unlimited,然後運行該程序。你應該看到一個核心轉儲。
您正在返回局部變量,它利用未定義行爲的地址。您需要在Called
或全局內部製作a
static
,或爲其分配內存。
而且使用%s
作爲格式printf
首先,這個功能:
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);
}
在這種情況下,指針應該是'const char *'(避免不建議使用的轉換)。 – visitor 2010-04-19 10:25:23
@visitor好點 - 改變了。 – 2010-04-19 12:48:28
%c
用於打印單個字符。您需要使用%s
來打印以空字符結尾的字符串。也就是說,當您嘗試從函數Called
返回本地變量a
的地址時,此代碼可能會崩潰。一旦返回Called
,此可變內存就會被釋放。你試圖使用這個釋放的內存是Caller
,並且在大多數情況下它會崩潰。
問題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++手冊,特別是關於指針和字符串的章節。
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());
}
我就給%唯一的而且沒有工作 – Sijith 2010-04-19 09:08:22
你能對你正在努力學習有什麼用細說。也許我們可以幫助更好,如果我們知道這一點,謝謝 – Jasmeet 2010-04-19 09:17:41