[英]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]
數組,此處ndx
為0
因此更新數組的第一個元素,然后再增加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.