即使在循环中从另一个函数分配值后,结构也变为NULL

时间:2019-03-04 21:45:37

标签: c pointers data-structures struct

我的代码有麻烦。如您在下面看到的,我必须使用链接列表技术来创建列表。我的问题是,执行该命令后,当在 add()函数外部打印 s-> item 时,程序崩溃。 当我在 add()函数中打印 s-> item 时,它确实会打印正确的数据。为什么 Statistician s 即使它的初始化不在while循环中,也再次变为null?

请不要介意typedef,它们是由我们的讲师提供的,我们必须将其用作基础,因此我们不必更改typedef和struct。

typedef struct node *nodePtr;
struct node {
    int item;
    nodePtr next;
};
typedef nodePtr Statistician;

Statistician newStatistician(){
      Statistician s = (Statistician)malloc(sizeof(Statistician));
      s = NULL;
      return s;
}

void add(Statistician s, int x){

Statistician newNode = (Statistician)malloc(sizeof(Statistician));

if(s == NULL){ // first node
    printf("first");
    newNode->next = NULL;
    newNode->item = x;
    s = newNode;

main(){
int menuChoice, clearDataChoice, x, outputInt, exitChoice, check;
float  outputFloat;
Statistician s = newStatistician();

while (TRUE){
    printf("\t\t*** STATISTICIAN PROGRAM v1 ***\n\n\n");
        printf("Please enter data to be added : ");
        x = inputNum();
        add(s, x);
        printf("%d", s->item);
//... bunch of other code

   if(exitChoice==TRUE)
        return 0;
    else{
        printf("\n\nPress any key to continue...");
        getch();
        system("cls");
        fflush(stdin);
        continue;
    } 
}

编辑:添加和主要是2个不同的功能

   void add(Statistician s, int x){}
    main(){}

1 个答案:

答案 0 :(得分:1)

与您的讲师交谈,并请他/她向您解释变量的范围。

此问题的根本原因是Statisticiannode *。因此,您将指向Statistician的指针传递给add(),但是add()收到了指针本身的私有副本:其变量s。您正在修改s的私有副本,但是该修改不会影响s中的main()。因此,您在add()中对私有副本所做的所有更改都会在返回时丢失。

解决此问题的最常用方法(这是C语言中的一种相当常见的模式)是从s返回add()的可能已修改的私有副本。因此,您可以将其声明更改为:

Statistician add(Statistician s, int x)

,然后在最底部添加以下内容:

return s;

然后当您在main()中实际调用它时,将行更改为:

s = add(s, x);

试一试,看看它如何工作。