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

1 回答 1

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 };
}
于 2012-11-20T01:38:13.190 回答