第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

C中局部變量錯(cuò)誤的函數(shù)返回地址

C中局部變量錯(cuò)誤的函數(shù)返回地址

C
陪伴而非守候 2019-11-04 12:56:19
我有以下代碼: char* gen() {     char out[256];     sprintf(out, ...); // you don't need to know what's in here I don't think     return out; }當(dāng)我嘗試編譯時(shí)出現(xiàn)此錯(cuò)誤:ERROR: function returns address of local variable我試過有這個(gè)回報(bào)率char[],并char沒有運(yùn)氣。我想念什么嗎?
查看完整描述

3 回答

?
叮當(dāng)貓咪

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)存分配/清理)。


查看完整回答
反對 回復(fù) 2019-11-04
?
茅侃侃

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ù)的字符串。


查看完整回答
反對 回復(fù) 2019-11-04
?
皈依舞

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ū)。


查看完整回答
反對 回復(fù) 2019-11-04
  • 3 回答
  • 0 關(guān)注
  • 503 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)