2012-11-20 103 views
4

考虑以下代码:如何从函数中的数组返回结构体? (指针)

typedef struct fruits_s 
{ 
    char* key; 
    char value; 
} fruits_t; 

static fruits_t fruit_array[] = { 
{ "Apple", 1 }, 
{ "Banana", 2 }, 
{ "Grape", 3 }, 
{ "Orange", 4 } }; 

static fruits_t* getFruitFromValue(char value) 
{ 
    int i; 
    for (i = 0; i < sizeof(fruit_array)/sizeof(fruit_array[0]); i++){ 
     if (value == fruit_array[i].value){ 
      return fruit_array[i]; 
     } 
    } 
} 

我是新来的C和指针时需要/使用还在学习。我来自Java背景。所以,在上面的代码中,我感到困惑的是该函数应该返回一个指针fruits_t*?或者是其他东西?当我做fruit_array[i]是一个指向我的结构,或结构本身?

话虽这么说,后来在我的代码时,我想使用的功能,是这样的:

fruits_t* temp = getFruitFromValue(1); 

fruits_t temp = getFruitFromValue(1); 

fruits_t temp = &getFruitFromValue(1); 
+0

我认为这将是回报与fruit_array [I] – dchhetri

+2

'fruit_array [i]'是结构体,如果你想返回一个指针,'&fruit_array [i]'或者等价的'(fruit_array + i)'。 –

+0

我想这是我的问题的一部分...我想返回一个指针,或不? –

回答

4

的功能,可以返回 - 您的选择。你说过你会返回一个指针;没关系,只要你这样做。

当你写:

static fruits_t *getFruitFromValue(char value) 
{ 
    int i; 
    for (i = 0; i < sizeof(fruit_array)/sizeof(fruit_array[0]); i++){ 
     if (value == fruit_array[i].value){ 
      return fruit_array[i]; 
     } 
    } 
} 

有几个问题:

  1. fruit_array[i]是一个结构,而不是一个指针。使用return &fruit_array[i];
  2. 如果循环退出,则根本不返回该函数的值。

解决了那些导致:

static fruits_t *getFruitFromValue(char value) 
{ 
    int i; 
    for (i = 0; i < sizeof(fruit_array)/sizeof(fruit_array[0]); i++) 
    { 
     if (value == fruit_array[i].value) 
      return &fruit_array[i]; 
    } 
    return NULL; 
} 

这是可以的,因为你返回的指针是会活得比的功能的静态数据。如果你试图返回一个指向非静态数据的指针,除非你使用了动态内存分配(通过malloc()等),否则你可能会(可能)在你手上有一个错误。

您也可以返回结构;处理错误返回变得更加困难。如果你有C99,您可以使用“复合文字”:

static fruits_t getFruitFromValue(char value) 
{ 
    int i; 
    for (i = 0; i < sizeof(fruit_array)/sizeof(fruit_array[0]); i++) 
    { 
     if (value == fruit_array[i].value) 
      return fruit_array[i]; 
    } 
    return (fruits_t){ .key = "", .value = 0 }; 
} 
+0

感谢您的详细回复。我理解你的大部分观点。我想我想知道的是,为什么我会返回一个指向这个数据的指针与结构本身?正如你所说的,结构超越了函数,所以我知道它是否没有指向它的指针会是一个坏主意。但你有其他想法吗? –

+0

对于这样的小型结构,返回结构副本是合理的。如果结构很大(比如说数百字节或更大),那么返回指针比返回值更明智。确保指针指向实时数据总是很重要的;返回一个值很大程度上摆脱了这个问题(尽管在这里,你在结构中有一个'char *';由于结构被分配的方式是安全的,但遇到问题并不难)。你可以使用'struct fruits_s {char key [11]; char值; };'以避免结构中的指针。 –

+0

'对于像这样的小型结构,返回结构副本是合理的。' 那么是创建副本并执行隐式“malloc”,为此副本分配内存?像这样使用更多的内存而不是返回指针,对吗? –