2012-07-31 11 views
6

私は静的配列を返すようにした瞬間、効率のために動的配列を返す方法はありますか?私の関数を動的配列に戻す方法はありますか?

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

関数から返されるものを別にして、Cには動的配列のようなものがありますか?代わりにポインタを意味しましたか?配列はポインタではありません。 http://eli.thegreenplace.net/2009/10/21/are-pointers-and-arrays-equivalent-in-c/ –

+0

「ダイナミックアレイ」はダイナミックメモリ割り当てを意味します。ダイナミックメモリ割り当ては、ほとんどの場合、動的(静的または自動)メモリ割り当て。だから、あなたは何の「効率」を言っていますか? – AnT

+0

おそらくメモリ効率。 –

答えて

5

関数は配列periodを返すことはできません。もちろん、呼び出し元によって割り当てられたメモリブロックへのポインタやポインタを使用できます。したがって、あなたの場合...

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へのポインタを返しています。

+0

配列が含まれている構造体を返すことでいくつかのジガーポケリーを行うことができます。 –

+0

@CarlNorum:そうだね。私はOPがこれに答えて何を期待しているか分からない。 –

+0

いいえ私はそれを投票しなかった私は残念これが私の初めての投稿です私は友人がゴミに見つけた本を使って自分自身を教えていました。 –

0

実際には静的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); 
} 

それを呼び出すコードがありますあまりにも)。