Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
即使从循环中的另一个函数赋值,Struct也会变为NULL_C_Pointers_Data Structures_Struct - Fatal编程技术网

即使从循环中的另一个函数赋值,Struct也会变为NULL

即使从循环中的另一个函数赋值,Struct也会变为NULL,c,pointers,data-structures,struct,C,Pointers,Data Structures,Struct,我的代码有问题。正如您在下面看到的,我必须使用链表技术制作一个列表。我的问题是,当我在执行add函数后在add函数外部打印s->item时,程序崩溃。 当我在add函数中打印s->项时,它确实打印了正确的数据。为什么统计学家会再次变为空,即使它的初始化在while循环之外 请不要介意typedef,它们是由我们的讲师提供的,我们必须使用它作为基础,这样我们就不必对typedef和structs进行任何更改 typedef struct node *nodePtr; struct node {

我的代码有问题。正如您在下面看到的,我必须使用链表技术制作一个列表。我的问题是,当我在执行add函数后在add函数外部打印s->item时,程序崩溃。
当我在add函数中打印s->项时,它确实打印了正确的数据。为什么统计学家会再次变为空,即使它的初始化在while循环之外

请不要介意typedef,它们是由我们的讲师提供的,我们必须使用它作为基础,这样我们就不必对typedef和structs进行任何更改

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;
    } 
}
编辑:添加和主是两个不同的功能

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

与你的导师交谈,让他/她向你解释变量的范围

问题的根本原因是统计学家是一个节点*。因此,您将一个指针传递给统计学家进行添加,但是add接收指针本身的私有副本:它的变量s。您正在修改s的私有副本,但该修改不会影响main中的s。因此,在add中对私有副本所做的所有更改在它返回时都将丢失

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

Statistician add(Statistician s, int x)
然后在最底部添加以下内容:

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

s = add(s, x);

尝试一下,看看它是如何工作的。

malloc返回一个指针,而不是一个对象。统计学家s=统计学家Mallocsizeofs统计学家;这是错误的。另请参见,您应该包括一个演示问题的示例。事实上,你有一大堆的函数,它们被切断了。此外,NewStatistican会泄漏内存,并且总是返回空指针。您不需要强制转换malloc的结果。此外,您只为指针分配了足够的内存,而不是为完整的节点对象分配了足够的内存;您可能需要删除第二个typedef,因为这可能会引起一些混乱。友好的建议:永远不要使用指针来定义typedef。你需要知道什么时候处理指针。用typedef隐藏指针实际上会使代码更难阅读。例如,在newstatistian函数中,sizeofstatistian是指针的大小,而不是节点结构的大小。请记住,由于不可靠的类型定义,statistian似乎已经是指针了。@PhilM Ugh。我把add的原型搞错了。现在修好了。当赫伯·萨特的导师说只做指针装饰的typedef是虚荣的,并且会带来麻烦时,这样的代码往往会加强我与她的一致性。谢谢你的快速回复,我要和我的导师谈谈这一点。但是,我想我会被告知只遵循给定的结构,为什么统计学家会成为一个私有变量,如果它是指针?我的意思是,如果它是指针,它如何不改变结构节点的值?