为什么结构指针的值错误

SL7Bot

因此,我开始研究C语言中的数据结构,并希望编写一个单链表。

这只是其中的一小部分:

struct nodes {
    int val;
    struct nodes *next;
};

void insert(struct nodes *list, int val) {
    struct nodes *tmp = (struct nodes*) malloc(sizeof(struct nodes));
    tmp->val = val;
    tmp->next = list;
    list = tmp;
}

int main() {
    struct nodes *test;
    insert(test, 5);
    insert(test, 10);

    printf("test %d\n", test->next->val);
}

在这里我得到完全错误的输出。当我尝试编写不需要传递结构指针的函数时,它的工作原理与预期的一样。

输出:

test 90053

PS我仍然从C开始,所以不要太刻苦:D

Arfneto

您可以这样进行:

    struct nodes {
    int val;
    struct nodes* next;
};

nodes* insert(struct nodes* list, int val) {
    struct nodes* tmp = (struct nodes*)malloc(sizeof(struct nodes));
    tmp->val = val;
    tmp->next = list;
    return tmp;
}

当尝试使用类似第一个函数的结构时,您写的---我相信---是list()而不是insert()。

在每个可以更改列表起始地址的函数中,您都必须返回该地址,否则它将丢失。而且由于您仅在开始处插入,所以丢失了所有内容,因为开始地址始终会更改。.通常不要使用void至少是浪费,通常是一个错误。返回一些信息,例如完成状态。查看list()返回的实现...size

int         list(struct nodes* list)
{
    struct nodes* p = list;
    int N = 0;
    while (p != NULL)
    {
        printf("#%d  %d\n", N, p->val);
        p = p->next; N += 1;
    };
    printf("\n");
    return N;
}

和使用2个函数的main()版本

int main() {
    struct nodes* test = NULL;
    int n = 0;
    for(n = 800; n>0; n-= 100) test = insert(test, n);
    n = list(test);
    printf("At the end list() returned %d\n", n);
}

这样,您从一开始就可以获得更多信息。

#0  100
#1  200
#2  300
#3  400
#4  500
#5  600
#6  700
#7  800

At the end list() returned 8

测试程序

#include <stdio.h>
#include <stdlib.h>

struct no
{
    void*       item;
    struct no*  next;
    struct no*  prev;
};  // no
typedef struct no Node;

typedef struct
{
    char* name;
    unsigned  size;
    unsigned  limit;
    Node* start;
    Node* end;
}   List;

struct nodes {
    int val;
    struct nodes* next;
};

struct nodes*   insert(struct nodes*, int);
int             list(struct nodes* L);

int main() {
    struct nodes* test = NULL;
    int n = 0;
    for(n = 800; n>0; n-= 100) test = insert(test, n);
    n = list(test);
    printf("At the end list() returned %d\n", n);
}

struct nodes*   insert(struct nodes* list, int val) {
    struct nodes* tmp = (struct nodes*)malloc(sizeof(struct nodes));
    tmp->val = val;
    tmp->next = list;
    return tmp;
}

int         list(struct nodes* list)
{
    struct nodes* p = list;
    int N = 0;
    while (p != NULL)
    {
        printf("#%d  %d\n", N, p->val);
        p = p->next; N += 1;
    };
    printf("\n");
    return N;
}

如评论中所指出的,请注意,列表不是node节点集合的列表,并且节点具有数据有效负载。如果有效负载为a,(void*)那么您将拥有一个真正的抽象数据结构,因为它可以加载任何内容,从单个char到一个100-fields structure

考虑一下您编写它的方式以及您的程序中有5个列表的情况:一团糟,它将变得非常快。并与下面的代码进行比较

链表结构

struct no
{
    void*       item;
    struct no*  next;
    struct no*  prev;
};  // no
typedef struct no Node;

typedef struct
{
    char* name;
    unsigned  size;
    unsigned  limit;
    Node* start;
    Node* end;
}   List;

请注意,当您向其中添加更多信息时,List事情会变得更加容易:您总是有一个大小,一个限制,开始和结束的指针等等。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么指针char在结构环境中引起分段错误

来自分类Dev

为什么将文件指针分配给结构指针成员会导致分段错误?

来自分类Dev

为什么在非指针结构上进行类型转换会导致语法错误

来自分类Dev

为什么在尝试查找结构指针的区别时出现垃圾值?

来自分类Dev

为什么在尝试查找结构指针的差异时会出现垃圾值?

来自分类Dev

声明结构的指针后的值是什么

来自分类Dev

为什么结构的大小与结构指针的大小不同

来自分类Dev

尝试为原始指针值赋予新值时,为什么会导致错误?

来自分类Dev

指针数组为什么会分段错误?

来自分类Dev

C ++为什么指针值改变了?

来自分类Dev

为什么free不能清除指针值?

来自分类Dev

为什么可以为指针分配值?

来自分类Dev

指针值错误的根源是什么?

来自分类Dev

指针值错误的根源是什么?

来自分类Dev

当指针指向零值时,为什么指针为空白?

来自分类Dev

为什么必须将我的结构声明为指针?

来自分类Dev

为什么在不同结构指针之间进行类型转换是可行的?

来自分类Dev

为什么可以用指针分配结构?

来自分类Dev

c-为什么指向结构的指针会使程序崩溃?

来自分类Dev

为什么在C结构定义中有嵌套的指针?

来自分类Dev

为什么我可以在声明之前使用结构类型的指针

来自分类Dev

为什么使用指针访问的结构成员未更新?

来自分类Dev

为什么将NULL强制转换为结构指针?

来自分类Dev

c-为什么指向结构的指针会使程序崩溃?

来自分类Dev

为什么此结构需要大小值?

来自分类Dev

C结构指针错误

来自分类Dev

设置结构指针的值

来自分类Dev

为什么指向结构的指针表现得像一个结构数组

来自分类Dev

为什么我可以分配局部变量并对其进行读取,但是如果我尝试在结构中分配指针并对其进行读取,则会出现段错误?

Related 相关文章

  1. 1

    为什么指针char在结构环境中引起分段错误

  2. 2

    为什么将文件指针分配给结构指针成员会导致分段错误?

  3. 3

    为什么在非指针结构上进行类型转换会导致语法错误

  4. 4

    为什么在尝试查找结构指针的区别时出现垃圾值?

  5. 5

    为什么在尝试查找结构指针的差异时会出现垃圾值?

  6. 6

    声明结构的指针后的值是什么

  7. 7

    为什么结构的大小与结构指针的大小不同

  8. 8

    尝试为原始指针值赋予新值时,为什么会导致错误?

  9. 9

    指针数组为什么会分段错误?

  10. 10

    C ++为什么指针值改变了?

  11. 11

    为什么free不能清除指针值?

  12. 12

    为什么可以为指针分配值?

  13. 13

    指针值错误的根源是什么?

  14. 14

    指针值错误的根源是什么?

  15. 15

    当指针指向零值时,为什么指针为空白?

  16. 16

    为什么必须将我的结构声明为指针?

  17. 17

    为什么在不同结构指针之间进行类型转换是可行的?

  18. 18

    为什么可以用指针分配结构?

  19. 19

    c-为什么指向结构的指针会使程序崩溃?

  20. 20

    为什么在C结构定义中有嵌套的指针?

  21. 21

    为什么我可以在声明之前使用结构类型的指针

  22. 22

    为什么使用指针访问的结构成员未更新?

  23. 23

    为什么将NULL强制转换为结构指针?

  24. 24

    c-为什么指向结构的指针会使程序崩溃?

  25. 25

    为什么此结构需要大小值?

  26. 26

    C结构指针错误

  27. 27

    设置结构指针的值

  28. 28

    为什么指向结构的指针表现得像一个结构数组

  29. 29

    为什么我可以分配局部变量并对其进行读取,但是如果我尝试在结构中分配指针并对其进行读取,则会出现段错误?

热门标签

归档