有啥方法可以让我的函数返回一个动态数组?
Posted
技术标签:
【中文标题】有啥方法可以让我的函数返回一个动态数组?【英文标题】:Is there any way to make my function return a dynamic array?有什么方法可以让我的函数返回一个动态数组? 【发布时间】:2012-07-29 19:21:03 【问题描述】:所以目前我有一个函数返回一个静态数组,有没有什么办法让它返回一个动态数组以提高效率?
#include <stdio.h>
#include <stdlib.h>
#include "header.h"
int *charpos(char *str, char ch)
int *bff, bc, ec, i, strln;
static int ret[255];
bc = 0;
ec = 0;
for(i = 0; str[i] != '\0'; i++)
;
strln = i;
for(i = 0; i <= strln; i++)
if(str[i] == ch)
ec++;
bff = malloc(sizeof(int)*ec);
if(sizeof(bff) > sizeof(ret))
free(bff);
return 0;
for(i = 0; i <= 255; i++) ret[i] = '\0';
for(i = 0; i <= strln; i++)
if(str[i] == ch)
ret[bc] = i;
bc++;
free(bff);
return ret;
【问题讨论】:
抛开函数可以返回的内容,C语言中有动态数组这样的东西吗?你的意思是指针,而不是?数组不是指针。 eli.thegreenplace.net/2009/10/21/… “动态数组”意味着动态内存分配,这通常比非动态(静态或自动)内存分配效率低得多。那么,您所说的“效率”是什么? 大概是内存效率吧。 【参考方案1】:函数不能返回数组,句号。您当然可以使用指针或指向调用者已分配的内存块的指针。所以,在你的情况下......
int *ret = malloc(255 * sizeof int); // caller must deallocate!
但是,这确实会改变代码的语义。您的函数的调用者现在负责在返回的指针上调用 free()
。如果他们不这样做,您将泄漏内存,因此这会增加一些以前不存在的复杂性。我更喜欢这样的东西:
void charpos(int *p, size_t size, const char *str, char ch)
// initialize the memory
memset(p, 0, size * sizeof int);
// your other code here...
size_t len = strlen(str);
// fill the caller's memory
for(i = 0; i < len; ++i)
if(str[i] == ch)
p[bc++] = i;
您正在返回一个指向 int
的指针,它引用静态分配数组的第一个元素。
【讨论】:
您可以通过返回一个包含数组的结构来做一些诡计多端的操作,但是 +1 以获得理智的答案。 @CarlNorum:没错,你可以。不过,我不确定 OP 对这个答案还有什么期望。 不,我没有投反对票,对不起,这是我第一次在这里发帖在这里注册。 @KeithMiller:没问题,我希望我能对不赞成票做出解释……好吧,无论如何,你不能动态分配 array (指针和数组不是一回事!)但你当然可以动态分配一块内存并返回一个指向它的指针。 @Ed,我投了反对票,因为您的答案最初只有前两句话,它们本身并没有太大帮助。一旦你编辑了你的帖子,我就把它收回了。不是故意引起这么大的困惑!【参考方案2】:您实际上可以使用静态 int 分配更多空间,而不必担心动态问题。以下是我的解决方法:
//indefinite reads, actually only up to 20
int * readDataAD7142(int addr, int numRegs)
static int data[20];
int i = 0;
//Do something with this data array. Something that requires less then 20 elements
return data;
这是调用它的代码
int *p;
int i;
p = readDataAD7142(0x0000, 6);
for(i=0; i<6; i++)
Serial.println(p[i], HEX);
如果你有更多的内存和很少的时间(你也需要有点懒惰),那么完美和简单。
【讨论】:
以上是关于有啥方法可以让我的函数返回一个动态数组?的主要内容,如果未能解决你的问题,请参考以下文章