有没有办法让我的函数返回一个动态数组?

时间:2012-07-31 22:37:48

标签: c arrays function dynamic return

所以目前我有一个函数我返回一个静态数组,有没有办法让它为了效率而返回一个动态数组呢?

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

2 个答案:

答案 0 :(得分:5)

函数无法返回数组,句点。您当然可以使用指针或指针指向调用者已分配的内存块。所以,在你的情况下......

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 :(得分:0)

您实际上可以使用static 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);
 }

如果你有更多的记忆然后你需要更少的时间(你也需要有点懒惰),这是完美而简单的。