【发布时间】: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