【问题标题】:Malloc return 0?malloc返回0?
【发布时间】:2015-06-17 19:53:42
【问题描述】:

我正在使用 Dev-C++ 编译器用 C 语言做一个家庭作业项目。奇怪的是,我遇到了一个返回我0 的malloc 函数,这意味着它的堆内存不足。我几乎不怀疑内存已满。 我已经包含了windows.h 库。

这是函数的问题部分。 printf 给了我:

00000000 ... 00000000 .... 005C1058

这里有什么问题?

typedef struct tcat {
    char *namec;
    struct tcat *nextc;
    struct tprod *firstp; 
}CTGR;

typedef struct tprod {
    char *namep;
    float price;
    int qt;
    struct tprod *nextp;
}PRDCT;

void Srch(int i)
{
    //data base population
    int k,r;

    //categories of components
    CTGR *p,*primc;
    primc = (CTGR *)malloc(sizeof(CTGR));

    primc -> namec = "Resistances";
    p = primc -> nextc;
    p -> namec = "Capacitors";
    p -> nextc = 0;


    PRDCT *q,*primRP,*primCP;
    primRP = (PRDCT *)malloc(sizeof(PRDCT));
    primCP = (PRDCT *)malloc(sizeof(PRDCT));

    printf(" %p ... %p .... %p",primRP,primCP,primc);
    getch();

【问题讨论】:

  • 您有问题吗?
  • @BillLynch ,“这里有什么问题?”
  • @BillLynch 正式问题是What is wrong here?,上下文是primRP 和primCP 打印为00000000。
  • @GSerg:在问题中他回答了。 malloc() 无法分配您的请求时,允许返回 NULL。
  • @BillLynch 那么问题是,为什么,鉴于结构是如此之小,内存几乎没有接近满。事实上,我相信 Bjorn Munch 的回答是正确的。 OP 应该通过将分配线移到顶部来验证这一点。

标签: c memory malloc heap-memory dev-c++


【解决方案1】:
p = primc -> nextc;

可能是罪魁祸首。该值未设置并且可以是任何值,因此当您通过它进行分配时,您正在写入内存中某个不可预测的位置。

【讨论】:

  • 我尝试了 p 的 printf。它给了我一个有效的地址。我想这不是问题。此外,据我所知,这种归因在结构中是一个普通的归因。这只是动态内存分配。
  • @GorganRazvan 就处理器而言,任何地址都是有效的。你不在这里进行分配,你让处理器相信p 现在指向tcat,而实际上它指向内存中的一个随机位置。写信到那个地方可能会出错malloc。
  • 所以...我想这可以解决问题: p = (CTGR *)malloc(sizeof(CTGR)); primc -> nextc = p;
猜你喜欢
  • 2011-01-09
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 2012-09-02
  • 2015-06-14
  • 2016-05-24
  • 1970-01-01
  • 2011-07-19
相关资源
最近更新 更多