Если вы хотите вернуть массив, у вас есть несколько возможных решений:
Передайте указатель (type*
) на функцию и скопируйте данные, например, не используя. memcpy
. Вы также должны передать размер целевого массива и убедиться, что вы не копируете слишком много данных.
Передать ссылку на указатель (type *&
) и присвоить указателю в функции
Передать адрес указателя (type**
) и назначить адрес разыменованному указателю.
Вы не должны возвращать адрес локальной переменной с автоматическим хранением. Если вы хотите вернуть a
(который является указателем на первый элемент) из функции, она должна быть либо static
, либо динамически выделена с использованием, например, malloc
.
Какое решение выбрать, зависит от ваших потребностей:
Примеры для 3 вариантов:
#include <stdio.h>
#include <memory.h>
void myfunc(char **pBuff, int &i);
void myfunc2(char *&pBuff, int &i);
void myfunc1(char *pBuff, size_t bufsize, int &i);
int main()
{
int len;
char aBuff[3]={0}; // increased size for NUL termination
char *ptr = aBuff;
printf("Hello World");
myfunc(&ptr,len);
printf("ptr %s", ptr);
printf("\n");
myfunc2(ptr,len);
printf("ptr %s", ptr);
printf("\n");
myfunc1(aBuff, sizeof aBuff,len);
printf("aBuff %s", aBuff);
return 0;
}
void myfunc1(char *pBuff, size_t bufsize, int &i){
char a[3] = {'c', 'd', '\0'}; /* added '\0' to allow using it as a string */
i = 5;
// actually the minimum of bufsize and sizeof(a) should be used
memcpy(pBuff, a, bufsize);
}
void myfunc(char **pBuff, int &i){
static char a[3] = {'a', 'b', '\0'}; // added '\0' to allow using it as a string
i = 5;
*pBuff = a;
}
void myfunc2(char *&pBuff, int &i){
static char a[] = "xyz";
i = 5;
pBuff = a;
}