从C中的函数返回数组
可能重复:从C中的函数返回数组,c,pointers,C,Pointers,可能重复: 我是C新手,需要了解您的想法,以帮助我从以下函数返回结果数组: void getBase(int n, int b) { const size_t SIZE = 32; char arr[32+1]={0}; int digits=SIZE, i; char* ptr = arr; while (n > 0) { int t = n%b; n/=b; arr[--digits] = num
我是C新手,需要了解您的想法,以帮助我从以下函数返回结果数组:
void getBase(int n, int b)
{
const size_t SIZE = 32;
char arr[32+1]={0}; int digits=SIZE, i;
char* ptr = arr;
while (n > 0)
{
int t = n%b;
n/=b;
arr[--digits] = numbers[t];
}
while ( *ptr == '\0') ptr++;
// NEED To return a ref to `ptr`
}
我的解决方案:
void getBase(int n, int b, /*send some array as a parameter*/ char* str)
{
const size_t SIZE = 32;
char arr[32+1]={0}; int digits=SIZE, i;
char* ptr = arr;
while (n > 0)
{
int t = n%b;
n/=b;
arr[--digits] = numbers[t];
}
while ( *ptr == '\0') ptr++;
/* and use strcpy ... perhaps memcpy if non-string )*/
strcpy(str, ptr);
}
我需要进一步的想法
谢谢。您的解决方案看起来不错 相反,您甚至不需要本地
arr
数组。您可以直接写入str
:
编辑:已清理和工作版本。
const char numbers[] = "0123456789abcdef";
void getBase(int n, int b, char* str)
{
const size_t SIZE = 32;
int digits=SIZE;
while (n > 0)
{
int t = n%b;
n/=b;
str[--digits] = numbers[t];
}
int length = SIZE - digits;
memmove(str,str + digits,length);
str[length] = '\0';
}
您只需确保str
足够大,以避免数组溢出
输出:
684719851
如果要返回长度为n的数组,应首先使用malloc创建数组,然后可以返回指针。例如
char *arr = malloc(n*sizeof(char));
//now arr points to an array, use it as you like
return arr;
确保将函数的返回类型设置为char*。您可以对任何类型的数组执行相同的操作-只需确保相应地更新所有类型
这实际上不如让用户通过要使用的数组,因为它让用户知道他负责管理所使用内存的生命周期。在本例中,如果忘记释放函数的返回值,则内存泄漏。另外,
n*sizeof(char)
是冗余的,因为sizeof(char)
被定义为1。此外,如果你按照他所做的做,从后到前填充数组,并返回指向数组中间的指针,你甚至不能调用free
,因此你陷入了内存泄漏@bchurchill
,正如塞思·卡内基所说,责任(所有权)除非我在某处记录类似于的内容,否则此指针的指针将丢失。注意,使用后应释放从函数返回的指针。。。这是我不喜欢的东西!另一个问题是,分配内存的接收器无法知道数组的长度,除非最后有一个sentinel值。在不传递缓冲区大小的情况下传递指向缓冲区的指针也不是一个好主意。@JimRhodes因此我添加了免责声明。你也可以在长度上通过。但是,如果长度不够大,那么您需要某种错误处理……我尝试使用char str[32]调用它;getBase(2,2,str)代码>但是返回无效值,请告诉我为什么?哦,等等,是的,我忘了你跳过前面的空字符。请给我一点时间,用memmove()
@Muhammad来解决这个问题。另外,变量i
未使用,您可以删除它。还有一件事,如果你使用指针而不是索引,你可以避免最后的而(可能会缩短代码)。我不喜欢#1
中遵循的模式,我更喜欢Objective-c模式。请参阅我对bchurchill
答案的评论。关于#2
我要试试,谢谢。这个问题没有简单的解决办法。(C++中有一些指针可以完成这项工作)。您可以使用您的解决方案(这也很好,也很常见),或者使用我的第二个解决方案(如果大小是恒定的,并且您在编译时就知道)。
char *arr = malloc(n*sizeof(char));
//now arr points to an array, use it as you like
return arr;