在函数中使用指针参数返回值时出现问题。该函数正确加载函数内的所有值,但之后无法将指针值传递给参数中的变量。
在我的情况下,我编写了一个函数,根据所讨论的内存分配是否失败,返回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 具有所有输入的值,但是一旦我离开函数并返回到主程序开始列表是香蕉。所以,我的问题是,我做错了什么,因为据我所知,这应该在理论上有效。提前谢谢。
答案 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()
犯了同样的错误,因为您也没有检查其返回值。如果分配失败,它还会导致导致内存泄漏的烦人问题。