無(wú)法返回字符串,只能返回字符串的首地址。如:char *p = GetString(); 返回的字符串空間必須是開(kāi)辟在堆上的,不能是棧,如果是棧當(dāng)函數(shù)結(jié)束時(shí),數(shù)據(jù)也會(huì)銷(xiāo)毀的;
創(chuàng)新互聯(lián)是一家以網(wǎng)絡(luò)技術(shù)公司,為中小企業(yè)提供網(wǎng)站維護(hù)、成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司、網(wǎng)站備案、服務(wù)器租用、域名注冊(cè)、軟件開(kāi)發(fā)、成都小程序開(kāi)發(fā)等企業(yè)互聯(lián)網(wǎng)相關(guān)業(yè)務(wù),是一家有著豐富的互聯(lián)網(wǎng)運(yùn)營(yíng)推廣經(jīng)驗(yàn)的科技公司,有著多年的網(wǎng)站建站經(jīng)驗(yàn),致力于幫助中小企業(yè)在互聯(lián)網(wǎng)讓打出自已的品牌和口碑,讓企業(yè)在互聯(lián)網(wǎng)上打開(kāi)一個(gè)面向全國(guó)乃至全球的業(yè)務(wù)窗口:建站歡迎咨詢:028-86922220
別聽(tīng) 樓上 的 瞎說(shuō), 也 別 百度 了, 都是 錯(cuò) 的, 我 告訴 你 正確 答案
函數(shù) 中 的 字符 串 在 函數(shù) 結(jié)束 的 時(shí)候 會(huì) 自動(dòng) 被 釋放 掉, 所以 即使 返回 char* 指向 的
也 就是 原 函數(shù) 字符串 的 地址, 訪問(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)單 的 辦法, 省心, 安全
在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ò)
你的
程序
修改如下
#include
"stdio.h"
#define
N
3
#define
M
80
void
_kf(char
b[N][M]);
int
main(void)
{
int
i;
char
a[N][M];
puts("請(qǐng)輸入3個(gè)字符串");
_kf(a);
for(i=0;iN;i++)puts(a[i]);
system("PAUSE");
}
void
_kf(char
b[N][M])
{
int
i;
for(i=0;iN;i++)gets(b[i]);
}
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ǔ)的最大空間。