传递指针以用作输出参数

时间:2019-03-28 07:45:15

标签: c++ pointers

我正在使用'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 :(得分:0)

如果要返回数组,则有几种可能的解决方案:

  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;
}

答案 1 :(得分:0)

您正在传递指向函数的指针,在函数内部,将临时变量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;
}

如果您需要在aBuff数组中存储2个字符,那么它需要3个字符长而不是2个字符,因为您需要为空终止符留出空间,否则printf和其他字符串函数将不起作用正确。