C函数通过其中一个参数返回结构数据

时间:2014-05-21 00:58:54

标签: c function pointers structure

在函数中使用指针参数返回值时出现问题。该函数正确加载函数内的所有值,但之后无法将指针值传递给参数中的变量。

在我的情况下,我编写了一个函数,根据所讨论的内存分配是否失败,返回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;
}

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

1 个答案:

答案 0 :(得分: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()犯了同样的错误,因为您也没有检查其返回值。如果分配失败,它还会导致导致内存泄漏的烦人问题。