【问题标题】:Returning struct返回结构
【发布时间】:2015-02-25 07:35:02
【问题描述】:

对不起,如果这个问题似乎是新手,我几天前就开始学习 C。

我有一个函数 (get_taken_values),它应该将一个字符串 (char[81) 作为输入并返回两个值:一个 int 和一个 int[9]。

正如我saw here,不可能返回多个值,所以我不得不使用结构。

这是我所拥有的:

#include <stdio.h>
#include <stdlib.h>

#define max_size 9
#define max_input 81

struct result {
    int position;
    int *taken;  
};

struct result get_result(int pos, int take[]){
    struct result res;

    res.position = pos;
    res.taken = take;

    return res;
}

struct result get_taken_values(char string_arg[max_input]){
    int position = 0;
    int* chosen = calloc(max_size, sizeof(int)); //suggestion from a previous question

    int someotherarray[9] = {1,2,3,4,5,6,7,8,9}; // fictional
    int i;
    for (i = 0; i < max_size; i ++) {
        chosen[i] = someotherarray[i]; 
    }

    struct result res = struct result(position, chosen);
    return res; // I to return int and int[9]: eg: 0,{1,2,3,4,5,6,7,8,9}
}

但我得到了:

ex16.c: In function 'get_taken_values':
ex16.c:127:22: error: expected expression before 'struct'
  struct result res = struct result(position, chosen);
                      ^

我尝试剪切 get_result,并在 get_taken_values 中创建结构:

// inside get_taken_values
struct result res;
res.position = position;
res.taken = chosen;
return res;

但它提出了这一点:

c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../libmingw32.a(main.o):main.c:(.text.startup+0xa7): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status

我打算将 get_taken_values 的返回值传递给 Python 并在那里使用它。

正确的做法是什么?

【问题讨论】:

  • struct result res = { position, chosen };。不过请注意参数顺序。
  • 给出同样的错误collect2.exe: error: ld returned 1 exit status
  • 链接器错误与您的问题无关;即使没有此代码,您也会得到它。它说你没有WinMain 功能。你呢?
  • 那么程序不完整。链接器在这里失败是非常正确的。如果你仔细解释你想要达到的目标,有人可能会为你解答。目前,您的问题显然不在于“返回结构”,返回 int 等时您将遇到相同的错误。
  • @RD445 它没有返回指向本地结构的指针,而是返回结构的副本。没事。我不知道python如何知道如何处理它,但这不是我以前使用的东西。有人应该在某个时候释放这段记忆。但这是一个单独的问题。

标签: c struct return


【解决方案1】:

就这样做

#include <stdio.h>
#include <stdlib.h>

#define max_size 9
#define max_input 81

struct result {
    int position;
    int *taken;  
};

struct result get_result(int pos, int take[]){
    struct result res;

    res.position = pos;
    res.taken = take;

    return res;
}

struct result get_taken_values(char string_arg[max_input]){
    struct result res;

    res.position = 0;
    res.taken    = malloc(max_size * sizeof(int)); // you don't need to 
                                                   // initialize the values 
                                                   // you will do it below
    if (res.taken == NULL) // always check the success of malloc
        return res;
    int someotherarray[9] = {1,2,3,4,5,6,7,8,9}; // fictional
    int i;
    for (i = 0; i < max_size; i ++) {
        res.taken[i] = someotherarray[i]; 
    }
    return res; // I to return int and int[9]: eg: 0,{1,2,3,4,5,6,7,8,9}
}

你必须记得在某个时候给free(res.taken)打电话。

【讨论】:

    【解决方案2】:

    您应该在代码中更正一些事情:

    开启struct result get_taken_values(char string_arg[max_input]) 不需要“max_input”。你可以只声明 '(char string_arg[])' 意味着你将向函数传递一个指向 char 类型的指针。

    开启int* chosen = calloc(max_size, sizeof(int));

    稍后您将初始化数组,因此无需使用calloc,您可以使用malloc。 始终检查 malloc 不返回 NULL。

    你应该这样写

    int* chosen = malloc(max_size * sizeof(int)); 
    if (chosen  == NULL) { 
        return res; 
    }
    

    最后,你不能使用struct result res = struct result(position, chosen);复制结构

    这是你需要做的:

    struct result get_taken_values(char string_arg[max_input])
    {
        struct result res;
        int* chosen = malloc(max_size * sizeof(int)); 
        if (chosen  == NULL) {
            return res;
        }
    
        res.taken = chosen;
        res.position = 0;
    
        int someotherarray[9] = {1,2,3,4,5,6,7,8,9};
    
        int i;
        for (i = 0; i < max_size; i ++) {
            res.taken[i] = someotherarray[i]; 
        }
        return res; 
        }
    

    【讨论】:

    猜你喜欢
    • 2016-07-30
    • 2021-12-12
    • 1970-01-01
    • 2014-04-22
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多