別聽(tīng) 樓上 的 瞎說(shuō), 也 別 百度 了, 都是 錯(cuò) 的, 我 告訴 你 正確 答案
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、微信小程序開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶(hù)創(chuàng)新互聯(lián)還提供了鹿邑免費(fèi)建站歡迎大家使用!
函數(shù) 中 的 字符 串 在 函數(shù) 結(jié)束 的 時(shí)候 會(huì) 自動(dòng) 被 釋放 掉, 所以 即使 返回 char* 指向 的
也 就是 原 函數(shù) 字符串 的 地址, 訪(fǎng)問(wèn) 的 是 一個(gè) 系統(tǒng) 沒(méi)有 分配 給 程序 的 內(nèi)存, 雖然 編譯器 不會(huì) 報(bào)錯(cuò), 但 語(yǔ)法 絕對(duì) 是 錯(cuò)誤 的,而且 你 不一定 能 得到 一個(gè) 正確 的 結(jié)果
三種 解決 方法:
1, struct ret { char a[100]; }; 返回 一個(gè) 結(jié)構(gòu), 結(jié)構(gòu)里面 包含 字符串
2, char* ret = (char *)malloc(100 * sizeof (char)); 在 函數(shù) 里 開(kāi) 一個(gè) 動(dòng)態(tài) 的 字符串, 這個(gè) 可以 返回, 不過(guò) 動(dòng)態(tài) 內(nèi)存 需要 手動(dòng) free 掉
3, 這個(gè) 不是 c語(yǔ)言 了, 調(diào)用 c++ 里面 的 string 類(lèi)型, 也是 最簡(jiǎn)單 的 辦法, 省心, 安全
給你寫(xiě)了個(gè)例子,fun函數(shù)用于為字符串開(kāi)辟空間,然后返回字符串的指針
#include stdio.h
#include stdlib.h
char * fun(int n)
{
return (char *)malloc(n);
}
void main()
{
char *ray;
int i;
ray = fun(5);
for (i = 0; i 4; ++i)
{
ray[i] = 65+i;
}
ray[4] = '\0';
printf("%s", ray);
}
把函數(shù)的返回值的類(lèi)型設(shè)置為char類(lèi)型的指針就可以了。
例如:char* MultMatrix( )
實(shí)例:
#include iostream
using namespace std;
char* MultMatrix( )
{
char*M = new char[4];
M[0]='a';
M[1]='b';
M[1]='c';
M[3]='d';
M[3]='\0';//給字符串寫(xiě)結(jié)尾
cout M[0] " " M[1] endl;//輸出返回前的數(shù)組
cout M[2] " " M[3] endl;
return M;
}
int main()
{
char *M = MultMatrix();
cout M[0] " " M[1] endl;//輸出返回后數(shù)組
cout M[2] " " M[3] endl;
delete[] M;
return 0;
}
運(yùn)行結(jié)果:
a b
c d
a b
c d
在time1()函數(shù)里,char now[]是個(gè)在函數(shù)里聲明的臨時(shí)變量
函數(shù)返回 char * p之后 ,char now[]的空間就已經(jīng)釋放掉了
如果你想返回時(shí)間字符串
把char now[80]; 改成 char *now =(char *)malloc(sizeof(char)*80);
用malloc函數(shù)申請(qǐng)空間,函數(shù)返回之后空間就不會(huì)被釋放掉了
VC++ 6.0編譯通過(guò)
C語(yǔ)言返回字符串有四種方式:1。使用堆空間,返回申請(qǐng)的堆地址,注意釋放2。函數(shù)參數(shù)傳遞指針,返回該指針3。返回函數(shù)內(nèi)定義的靜態(tài)變量(共享)4。返回全局變量使用分配的內(nèi)存,地址是有效
char *fun()
{
char* s = (char*)calloc(100, sizeof(char*) );
if (s)
strcpy ( s , "abc " );
return s;
}
但這種方式需要注意,必須由使用將將返回的地址free掉
將地址由入?yún)魅?/p>
char* fun(char*s)
{
if (s)
strcpy(s, "abc ");
return s;
}
這種方式調(diào)用都要注意給s分配的大小是足夠。
可以這樣:
char* fun(char*s, int len)
{
if (s)
{
strncpy(s, "abc ", len-1);
s[len-1] = 0;
}
return s;
}
或才使用局部靜態(tài)變量
char* fun()
{
static char s[100];
strcpy(s, "abc ");
return s;
}
這種方式需要注意,不要修改返回的這個(gè)字符串,由于是共享地址,對(duì)它的修改會(huì)反應(yīng)到每個(gè)調(diào)用者的。可以這樣:
const char* fun()
{
static char s[100];
strcpy(s, "abc ");
return s;
}
還有一種是使用全局變量
char g_s[100];
char* fun()
{
strcpy(g_s, "abc ");
return s;
}
同樣的,也要注意這個(gè)變量可存儲(chǔ)的最大空間。
要返回字符串 需要返回char*類(lèi)型
需要注意的是 返回的字符串 不能是該函數(shù)的局部變量,否則會(huì)導(dǎo)致出錯(cuò)
可以是參數(shù)字符串,全局變量,靜態(tài)局部變量,或者動(dòng)態(tài)分配的內(nèi)存
比如
char?*my_str_cpy(char?*d,?char?*s)
{
char?*p=d;
while(*p++=*s++);
return?d;//返回參數(shù)字符串。?
}