3 回答

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊
你的char數(shù)組變量out只存在內(nèi)部函數(shù)體。
當(dāng)您從函數(shù)返回時(shí),out緩沖區(qū)的內(nèi)容將無法再訪問,它僅是函數(shù)的本地內(nèi)容。
如果要將函數(shù)中的某個(gè)字符串返回給調(diào)用者,則可以在函數(shù)內(nèi)部動(dòng)態(tài)分配該字符串(例如使用malloc()),并將指向該字符串的指針返回給調(diào)用者,例如
char* gen(void)
{
char out[256];
sprintf(out, ...);
/*
* This does NOT work, since "out" is local to the function.
*
* return out;
*/
/* Dynamically allocate the string */
char* result = malloc(strlen(out) + 1) /* +1 for terminating NUL */
/* Deep-copy the string from temporary buffer to return value buffer */
strcpy(result, out);
/* Return the pointer to the dynamically allocated buffer */
return result;
/* NOTE: The caller must FREE this memory using free(). */
}
另一個(gè)更簡單的選擇是將out緩沖區(qū)指針char*與緩沖區(qū)大小一起作為參數(shù)傳遞(以避免緩沖區(qū)溢出)。
在這種情況下,您的函數(shù)可以將字符串直接格式化為作為參數(shù)傳遞的目標(biāo)緩沖區(qū):
/* Pass destination buffer pointer and buffer size */
void gen(char* out, size_t out_size)
{
/* Directly write into caller supplied buffer.
* Note: Use a "safe" function like snprintf(), to avoid buffer overruns.
*/
snprintf(out, out_size, ...);
...
}
請注意,您在問題標(biāo)題中明確指出了“ C”,但添加了[c++]標(biāo)簽。如果你可以使用C ++,以最簡單的做法是使用一個(gè)字符串類像std::string(并讓它管理所有的字符串緩沖區(qū)的內(nèi)存分配/清理)。

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超21個(gè)贊
當(dāng)您在函數(shù)中使用以下聲明時(shí),char out[256];一旦函數(shù)返回,分配的空間將被釋放,因此返回指向out char數(shù)組的指針沒有任何意義。
如果你想返回一個(gè)指向你,你應(yīng)該使用函數(shù)創(chuàng)建一個(gè)字符串malloc(),如
char* out = (char*)malloc(256*sizeof(char));
它分配了256 chars的空間,但是應(yīng)該在某個(gè)時(shí)候通過free()函數(shù)手動(dòng)釋放它。
或如Brian Bi的注釋中所建議的,傳遞a char *指向要用作函數(shù)參數(shù)的字符串。

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊
問題在于,當(dāng)函數(shù)gen返回(退出)時(shí),其局部變量(例如out)超出范圍,并且調(diào)用者無法再訪問它。因此,當(dāng)您返回時(shí),您將out返回一個(gè)指針,該指針不再分配。
有兩個(gè)選項(xiàng)可從函數(shù)“返回”指針/緩沖區(qū):
在調(diào)用函數(shù)中分配緩沖區(qū),并將其傳遞給gen:
char out[256];
gen(out, sizeof out);
通常還提供傳入的緩沖區(qū)的大小,因?yàn)楸徽{(diào)用的函數(shù)無法知道這一點(diǎn)。這意味著您必須將gen的聲明更改為:
void gen(char * out, size_t size){
您也可以將傳入緩沖區(qū)的大小硬編碼為256(因?yàn)槟F(xiàn)在已將其硬編碼在gen函數(shù)中):
void gen(char out[256]){
這意味著你必須提供類型的變量char[256]來gen(并且沒有其他指針或陣列)。但這確實(shí)允許您在sizeof out 內(nèi)部 做gen。
在函數(shù)內(nèi)部動(dòng)態(tài)分配緩沖區(qū):
char * out = malloc(256 * sizeof *out);
// ...
return out;
這樣做的好處是gen不會(huì)更改聲明。但這確實(shí)意味著調(diào)用函數(shù)free完成操作后必須返回緩沖區(qū)。
- 3 回答
- 0 關(guān)注
- 503 瀏覽
添加回答
舉報(bào)