Передача указателя на функцию в качестве выходного параметра - PullRequest
0 голосов
/ 28 марта 2019

Я использую 'pBuff' в качестве указателя и помещаю массив char в функцию 'myfunc'.Итак, в основной функции, я должен получить его в aBuff.

Но он не работает .. что здесь не так ??

#include <stdio.h>

void myfunc(void *pBuff, int &i);
int main()
{
    int len;
    char aBuff[2]={0};
    printf("Hello World");
    myfunc(aBuff,len);
    printf("aBuff %s", aBuff);

    return 0;
}

myfunc(void *pBuff, int &i){
    char a[2] = {'a', 'b'};
    i = 5;
    pBuff = &a;
}

char a[] должен прийти как выходной параметр восновная функция

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Вы передаете указатель на вашу функцию, внутри вашей функции вы присваиваете адрес временной переменной a переменной pBuff.На исходную переменную aBuff это не влияет.

Поскольку мы используем c ++, гораздо более простое решение с использованием строк будет выглядеть следующим образом:

#include <iostream>

void myfunc(std::string& pBuff, int &i);
int main()
{
    int len;
    std::string aBuff;
    std::cout << "Hello World";
    myfunc(aBuff,len);
    std::cout << "aBuff " << aBuff;

    return 0;
}

void myfunc(std::string& pBuff, int &i){
    pBuff = "ab";
    i = 5;
}

Если вы действительно должны использовать необработанные массивы символов, тогда это будетодин из способов его реализации (обратите внимание на удаление void*, нет причин использовать его здесь):

myfunc(char *pBuff, int &i){
    strcpy(pBuff, "ab");
    i = 5;
}

Если вам нужно сохранить 2 символа в вашем массиве aBuff, это должно быть 3длина символов не 2, так как вам нужно оставить пробел для нулевого терминатора, иначе printf и другие строковые функции не будут работать правильно.

0 голосов
/ 28 марта 2019

Если вы хотите вернуть массив, у вас есть несколько возможных решений:

  1. Передайте указатель (type*) на функцию и скопируйте данные, например, не используя. memcpy. Вы также должны передать размер целевого массива и убедиться, что вы не копируете слишком много данных.

  2. Передать ссылку на указатель (type *&) и присвоить указателю в функции

  3. Передать адрес указателя (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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...