我正在使用'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[]
应该作为主要功能的输出参数
答案 0 :(得分:0)
如果要返回数组,则有几种可能的解决方案:
将指针(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;
}
答案 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
和其他字符串函数将不起作用正确。