代码块中的动态分配

时间:2017-04-09 10:33:23

标签: c list malloc

我正在尝试在C中创建链接列表。我已经在我们在学校使用的Turbo C ++中启动并运行该程序。当我尝试将代码放入代码块时,我无法运行它。我删除了很大一部分代码,以便在调试时看到停止工作的部分。当它编译时,它没有说错误,只是停止工作。我想我可能是因为我动态分配内存。

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

struct data
{
    int a;
    int b;
};

struct node
{
    struct data info;
    struct node *urm;
};

struct lista
{
    int lungime;
    struct node *curent, *prim, *ultim;
};

struct lista *listax;

int creare(struct lista *LP)
{
    LP->prim = (struct node*)malloc(sizeof(struct node));
    LP->ultim = (struct node*)malloc(sizeof(struct node));
    LP->prim->urm = LP->ultim;
    LP->ultim->urm = NULL;
    LP->curent=LP->prim;
    LP->lungime = 0;
    return 1;
}

int main()
{
    creare(listax);
    return 0;
}

我必须使用这种类型的声明,因为我们的老师希望我们如何呈现列表(带有开始和结束节点)。任何帮助表示赞赏。

*编辑:
prim是第一个 ultim是最后一位 肺活量是长度的 urm是下一个

1 个答案:

答案 0 :(得分:1)

您的内存分配确实不正确。在尝试分配给LP的每个成员之前,必须为LP本身指向的结构分配空间,例如:

LP = malloc(sizeof(*LP));

其他建议

  1. 当您分配空间时,通常应该check the result of the allocation functionmalloc() / calloc() / realloc()),因为如果该功能无法返回null分配请求的内存。您可以在if之后使用简单的malloc()语句执行此操作,例如:if (!LP) return -1;
  2. Do not cast the return value of malloc()
  3. variable name rather than a type上使用sizeof通常会更好,例如LP->prim = malloc(sizeof(LP->prim));
  4. 任何时候你分配内存,你应该记得在完成它后释放分配的内存!使用free()执行此操作。如果你没有释放内存,程序会泄漏内存,也就是说每次都会分配越来越多的内存,并最终分配你计算机上的所有内存,即使你的程序实际上只需要使用它分配的一点点内容。请参阅thisthis
  5. 正如@StoryTeller指出的那样,使用空格来让你的代码可读 - 将它们拼凑在一起以使它看起来更短,或者某些东西,不会使它看起来很专业,它只是看起来难以理解(因此很难让其他人帮助你)。

    在一些书写系统中使用空格来划分单词或组信息可能不是常态(例如,某些中东语言对它的重视程度较低或不重要),但很多代码都是用美式英语编写的, 。因此,编写同事,教师或贡献者可以轻松阅读的专业代码将涉及以这种方式使用空白区域,这将是您需要学习的东西,就像学习语言的语法一样。

    This question可能是开始使用代码样式的好点,但您也可以查看一些命名的C样式指南,例如GNU,Linux Kernel,BSD等