Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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
C.分段错误中的链表_C_Pointers_Data Structures_Struct_Linked List - Fatal编程技术网

C.分段错误中的链表

C.分段错误中的链表,c,pointers,data-structures,struct,linked-list,C,Pointers,Data Structures,Struct,Linked List,我只是从添加一个字符开始。如果我不能做到这一点,我就不能再做其他的事情了 这给了我错误,但我真的不知道为什么 另外,我仍然不明白为什么在insert调用中我应该写&但是在printlist调用中我不应该写&。您实际上没有为newlinkPtr分配内存。因此,您只是取消引用并尝试写入未初始化的指针,从而导致未定义的行为 在“插入”中,可以将其修改为: #include <stdio.h> struct mychar{ char value; struct mycha

我只是从添加一个字符开始。如果我不能做到这一点,我就不能再做其他的事情了

这给了我错误,但我真的不知道为什么


另外,我仍然不明白为什么在insert调用中我应该写&但是在printlist调用中我不应该写&。

您实际上没有为newlinkPtr分配内存。因此,您只是取消引用并尝试写入未初始化的指针,从而导致未定义的行为

在“插入”中,可以将其修改为:

#include <stdio.h>


struct mychar{
    char value;
    struct mychar *nextPtr;
};

typedef struct mychar Mychar;
typedef Mychar *MycharPtr;


void insert(MycharPtr *, char );
void printlist(MycharPtr);


int main(){
    MycharPtr startPtr = NULL;

    char b = 'b';

    insert(&startPtr, b);

    printlist(startPtr);
}

void insert(MycharPtr *sPtr, char newvalue){

    MycharPtr newlinkPtr;

    if (*sPtr == NULL){
        newlinkPtr->value = newvalue;
        newlinkPtr->nextPtr = NULL;
    }

    *sPtr = newlinkPtr;
}


void printlist(MycharPtr currentPtr){
    printf("%c", currentPtr->value);
}

这也在某种程度上说明了为什么类型定义结构指针可能会误导并被认为是一种不好的做法。我建议避免使用。

非常感谢。我也讨厌这种类型的ptr。。。它在我的书中,所以我认为为了更好的编程实践,我最好使用它,但它实际上让我困惑。一个问题:我真的不明白为什么需要用malloc初始化。。。在没有malloc的情况下创建新指针不应该实际分配内存吗?为什么没有,我需要malloc?要清楚,类型定义指针并不总是坏的,不透明类型就是这样创建的。但在这种情况下,这是不必要的,也是误导性的。重新。对malloc的需求:mylinkPtr的定义只是为指针本身创建了一个指针,因为内存是分配的。但它并没有指向任何有效的地方。所以你需要让它指向一个有效的内存块才能写;我实际上是在创建一个新的结构节点和一个指向该结构的指针,对吗?这就是为什么之前它不起作用的原因,因为我只是用MycharPtr newlinkPtr创建了一个指针;但是没有创建新的结构。这是正确的。如果没有typedef,它看起来像:struct mychar*newlinkPtr=mallocsizeof*newlinkPtr;。这让它更容易理解吗?是的,谢谢!如果我这样做的话就不一样了:Mychar*newlinkPtr=mallocsizeofMychar?
MycharPtr newlinkPtr = malloc(sizeof *newlinkPtr);
if (!newlinkPtr) {
    perror("malloc");
    return;
}

...