有啥方法可以让我的函数返回一个动态数组?

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

如果你有更多的内存和很少的时间(你也需要有点懒惰),那么完美和简单。

【讨论】:

以上是关于有啥方法可以让我的函数返回一个动态数组?的主要内容,如果未能解决你的问题,请参考以下文章

通过C中的void函数返回动态数组

在 Swig 中通过 ref 返回动态数组

java的静态数组和动态数组有啥区别?

调整动态分配的指针数组的大小(复制构造函数不起作用?)

c语言动态数组如何扩充空间

如何使用表单从数组动态创建复选框?