【问题标题】:C function returning structure data through one of the arguments通过参数之一返回结构数据的 C 函数
【发布时间】:2014-05-21 00:58:54
【问题描述】:

在函数中使用指针参数返回值时遇到问题。该函数正确加载了函数内的所有值,但不知何故未能将指针值传递给参数中的变量。

在我的例子中,我写了一个函数,它返回 1 或 0,具体取决于所讨论的内存分配是否失败,并且作为参数之一,它需要一个指向需要输入的列表的指针。列表的结构如下所示:

typedef struct sList {
    int id;
    char first_name[30];
    char last_name[30];
    struct sList *next;
} tList;

函数如下所示:

int readList(tList *start, int n){
    tList *head = NULL;
    tList *tail = NULL;
    int i;
    for (i = 0; i < n; i++){
        tList *tmp = malloc(sizeof(tList));
        if (tmp == NULL) return 0;
        scanf("%d %s %s", &tmp->id, &tmp->first_name, &tmp->last_name);
        tmp->next = NULL;
        if (!head) head = tmp;
        else tail->next = tmp;
        tail = tmp;
    }
    start = head;
    return 1;
}

以及主要方法:

void main(){    
    tList *start = NULL;
    int n;

    scanf("%d", &n);
    readList(start, n);

    tList *tmp = start;
    while (tmp){
        printf("%d %s %s\n", tmp->id, tmp->first_name, tmp->last_name);
        tmp = tmp->next;
    }
    system("PAUSE");
    return;
}

在调试过程中,我得出结论,函数内部的列表 headstart 具有所有输入的值,但是一旦我离开函数并返回start 列表的主程序很简单。所以,我的问题是,我做错了什么,因为据我所知,这在理论上应该可行。提前致谢。

【问题讨论】:

  • 许多重复项,简短的回答是您需要将指针传递给您的指针,即int readList(tList ** start, int n) { ...
  • 你的签名需要是一个指向指针的指针:int readList(tList **start, int n) {...}。然后这样称呼它:readList(&amp;start, n);.

标签: c function pointers structure


【解决方案1】:

如果你想在函数中改变一个变量,你需要传递一个指针给它,并在所说的函数中取消引用该指针。这就是 C 模拟传递引用的方式。

当那个变量本身是一个指针时,这意味着你需要将一个指针传递给该指针,例如:

int readList(tList **pStart, int n){
    // blah blah blah, setting up head.
    *pStart = head;
    return 1;
}

int main(void){    
    tList *start = NULL;
    int n;

    scanf("%d", &n);
    readList(&start, n);  // Note this, using address-of

    // more blah
    return 0;
}

下面的文字是对您的具体问题的补充,但为了完整起见,我想我会提到它。

您的 main 函数不符合标准允许的规范函数 - 我已对其进行了更改以使其更容易接受,但对于您的特定实现可能没有必要,具体取决于它的松懈程度。遵循标准仍然是一个好主意。

假设(在健壮的代码中)scanf() 始终有效也是危险的。如果它返回零(成功扫描的项目数),n 几乎肯定不会是您所期望的。

你对readList() 犯了同样的错误,因为你也没有检查它的返回值。如果分配失败,它还具有导致内存泄漏的烦人方面。

【讨论】:

    猜你喜欢
    • 2015-02-14
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2013-05-03
    • 2018-08-06
    • 1970-01-01
    相关资源
    最近更新 更多