簡體   English   中英

如何在C中返回指向數組的指針

[英]How to return pointer to array in c

我在main()內部調用函數getdata() ()。 getdata()從uart讀取字符,並將其放入數組中。 在函數的最后,它通過uart寫入數組。

我的問題是,如何獲得此函數以返回數據? 我知道您不能在c中返回數組,而應該聲明一個返回指針的函數。

我該如何使用下面的函數來做到這一點,以便我可以在main中寫出數據,而不必在getdata()

int main(void)
{
    getdata();
}

void getdata(void)
{
    static uint8_t ndx;
    char recChars[6];
    char retchar;
    ndx = 0;

    retchar = getch(); 
    recChars[ndx] = retchar;
    ndx++;

    if (retchar == '\r'){
        recChars[ndx] = '\n';
        ndx = 0;
        uart_write(UART_D, (uint8_t *)recChars, sizeof(recChars));
    }            
}

char getch(void) {
uint8_t ch = 0;
chuart_read(UART_D, &ch);
return ((char) ch);
}

您需要使recChars成為指針,並使用malloc()或family為其分配動態內存。 然后,您可以將指針返回給調用者,並在調用者中使用它。

就像是

char * getdata()         //change return type
{
    static uint8_t ndx;
    char * recChars = NULL;  // change to pointer
    char retchar;
    ndx = 0;

    if ( (recChars = malloc(6)) == NULL ) return NULL;

    retchar = getch(); 
    recChars[ndx] = retchar;
    ndx++;

    if (retchar == '\r'){
        recChars[ndx] = '\n';
        ndx = 0;
        //uart_write(UART_D, (uint8_t *)recChars, sizeof(recChars));
    }     

  return recChars;      //finally return
}

請記住,使用結束后,在調用者中返回的指針需要為free() d以避免內存泄漏。

您必須編寫一個返回指向char的指針的函數,並使用malloc分配內存。 您必須使用malloc,因為這樣聲明的數組

char v[11];

屬於自動存儲類,這意味着它們具有塊作用域,一旦您的函數返回,它們將被刪除,並且默認情況下不進行初始化。 如果您有指向該內存塊的指針,則可以在程序中的任何位置訪問動態內存。 您還記得使用free()釋放內存以避免內存泄漏。 如果您返回了指向自動數組的指針,則可能會得到SIGSEGV,因為您的指針持有的存儲位置不再存在。 所以你可以這樣寫:

char *foo(void)
{
    char *p = malloc(sizeof(type) * n);
    return p;
}

在主要

int main(void)
{
    char *pointer = foo();
    /*Do something*/
    free(pointer);
    return EXIT_SUCCESS;
}

PS:我為我的英語道歉

我建議您在main()函數本身中聲明一個數組,並通過arrray作為對getdata函數的引用,因此,每當getdata()得到更新時,它將反映在main()中的數組中。

注意:順便說一句,為什么要使用sizeof(recChars),它將給出6,但是您最多只能更新2個位置。 我也將其納入代碼中

int main(void)
{
    char recChars[6];
    int Rxd_Len = 0;

    Rxd_Len = getdata(&recChars); //Pass the address of array
    uart_write(UART_D, (uint8_t *)recChars, Rxd_Len );
}

int getdata(char *ptr_recChars)
{
    uint8_t ndx; // removed static since its not a required/mandatory
    char retchar;
    ndx = 0;

    retchar = getch(); 

    *(ptr_recChars + ndx) = retchar; //Asign the value to the array address + offset


    if (retchar == '\r'){
        ndx++;
        *(ptr_recChars + ndx) = '\n';

    }  

   return ndx;          
}

char getch(void) {
uint8_t ch = 0;
int ret;
ret = uart_read(UART_D, &ch);
return ((char) ch);
}

更新:

在main()中調用uart_write()可以嗎? 是的,您可以這樣做,但是由於uart_write()將使用長度進行傳輸,因此您需要使用另一個變量來跟蹤它。

另外,為什么這條線是必需的? *(ptr_recChars + ndx) = retchar; ptr_recChars是一個指向數組recChars[6]指針,因此即使使用main()*(ptr_recChars + ndx)聲明了數組,也可以使用該指針更新recChars[6]數組,此處ndx0因此更新數組的第一個元素,然后再增加ndx然后使用指針變量,我們可以通過*(ptr_recChars + ndx)指向新的更新位置(因為ndx現在是新值)

另外,我應該在getdata(&recChars);中使用&運算符; 不,數組名稱本身是一個指針,因此對於recChars[6] simplay,僅給出recChars即可給出數組的基地址,另外請注意recChars&recChars[0]含義相同。 因此,如果您提供&recChars則意味着recChars是一個地址,然后添加&recChars假定一個地址的地址,該地址將在表達式中提供無效的值。

您可以編寫返回char *的函數,並使用malloc為該表創建一些存儲,如上所述,或者可以簡單地將數組聲明為static並返回它。 更明確地說:

char * getdata(void){靜態char retChar [6]; ...返回retChar; }

作品。 這樣做的原因是在特定的段中保留了陣列存儲。

具有malloc的版本為堆中的數組保留存儲空間,這需要您隨后釋放它:

char * getdata(void){char * retChar =(char *)malloc(6); ...返回retChar; }

main(){char * ptr = getdata(); ... free(ptr); }

最后,您唯一不能做的就是聲明該數組並按原樣返回它,沒有靜態聲明,也沒有malloc ...原因是您的數組分配在調用堆棧中,因此有可能丟失從getdata返回時。 換句話說,永遠不會做:char * getdata(void){char retChar [6]; ...返回retChar; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM