【问题标题】:malloc crashes in loop but fine outside of loopmalloc 在循环中崩溃,但在循环外很好
【发布时间】:2025-12-20 02:25:06
【问题描述】:

我有以下过程导致我的程序崩溃:

void parseLinear(xmlDocPtr doc, xmlNodePtr node, struct daastXML *xmlFile){

// Set up Linear Property Here
struct daastLinear *Linear;
Linear = (struct daastLinear *) malloc (sizeof(struct daastLinear));

// Assign  Property
xmlFile->Ads->data->Inline->Creatives->data->linear = Linear;

// ***** THIS IS FINE HERE
struct daastMediaFile *newMediaFile;
newMediaFile = (struct daastMediaFile *) malloc (sizeof(struct daastMediaFile));

do {

    // ***** PROGRAM CRASHES IF I PUT IT HERE INSTEAD
    //struct daastMediaFile *newMediaFile;
    //newMediaFile = (struct daastMediaFile *) malloc (sizeof(struct daastMediaFile));


    if (xmlStrcmp (node->name, XMLSTR("Duration")) == 0){

        char *nodeValue = (char *) node->children->content;
        xmlFile->Ads->data->Inline->Creatives->data->linear->duration = malloc (sizeof(char));
        strcpy (xmlFile->Ads->data->Inline->Creatives->data->linear->duration, nodeValue);

    } else if (xmlStrcmp (node->name, XMLSTR("MediaFiles")) == 0){
        //
        parseMediaFiles(doc,node->children,xmlFile);
    }
} while ((node = node->next));

}

问题出在以下几行:

struct daastMediaFile *newMediaFile;
newMediaFile = (struct daastMediaFile *) malloc (sizeof(struct daastMediaFile));

如果我把它们放在循环之外,程序可以正常工作,但如果我把它们放在循环中,它只会崩溃,我看不到任何错误日志。

有人知道这里发生了什么吗?

编辑和可能的修复? 这是 MediaFile 的原始结构:

//THIS CAUSES A CRASH
struct daastMediaFile {
    char *id;
    char *delivery;
    char *type;
    char *url;
    char *bitRate;
};

但是添加一个 int 变量,它就可以工作了吗?

//THIS CAUSES A CRASH
struct daastMediaFile {
    char *id;
    char *delivery;
    char *type;
    char *url;
    char *bitRate;
    int MediaID;
};

【问题讨论】:

  • 不要转换malloc的返回值。
  • 把它放在循环中意味着你一次又一次地分配内存。你真的想这样做吗?
  • 看我上面的修复,循环应该只发生一次,但它可能有两到三次,所以这不是一个大问题。它并没有真正解释为什么它从来没有工作过,无论如何循环只用我的测试数据迭代一次
  • @GlennCooper,如果问题已经停止出现,那么不太可能是因为您更改了struct daastMediaFile 的成员。 malloc() 既不知道也不关心你的结构的成员;它只是分配请求的字节数。
  • 为了让我们确定到底发生了什么,我们需要查看MCVE

标签: c loops struct crash malloc


【解决方案1】:
xmlFile->Ads->data->Inline->Creatives->data->linear->duration = malloc (sizeof(char));

这只会为一个字符分配内存。在 C 中,它可能只包含一个空字符串(因为最后一个字符是 '\0')。是你想要的吗?

【讨论】:

  • 您完全错过了崩溃的重点,但如果您在上面看到我的修复,它现在似乎可以工作了。关于持续时间 - 这也可以正常工作,并且能够存储更多我需要的东西
  • @GlennCooper 所以你有bodged一个“有效”的修复吗?
  • @GlennCooper 通常认为因为您移动了一条改变行为的线路,那么这就是故障线路。正如这个答案所说,您分配了一个字节的内存,然后将一个字符串复制到该空间中。这个答案远非“错过重点”,而是在您的代码中发现了明确的错误。
  • xmlFile->Ads->data->Inline->Creatives->data->linear->duration = malloc (strlen(nodeValue)+1);。或者,如果您的 C 运行时库具有 strdup,则可以使用 xmlFile->Ads->data->Inline->Creatives->data->linear->duration = strdup(nodeValue);(在这种情况下,您不需要 strcpy 调用,因为 strdup 结合了 mallocstrcpy)。
【解决方案2】:
//Outside the loop
typedef struct daastMediaFile *daastMediaFiles;
daastMediaFiles newMediaFile;

//In the loop, if needed. free() is important in end of loop
newMediaFile = malloc(sizeof *newMediaFile);

...

free(newMediaFile);

【讨论】: