C 马洛克错配?
这里是C程序员的新手。当训练设置得很小时,这段代码运行得很好,但当范围增大时,它开始崩溃。现在它在1289断开,但我想用到7892。误差如下;我相当肯定它与malloc调用中的某些内容有关,但我不确定如何修复它。谢谢C 马洛克错配?,c,C,这里是C程序员的新手。当训练设置得很小时,这段代码运行得很好,但当范围增大时,它开始崩溃。现在它在1289断开,但我想用到7892。误差如下;我相当肯定它与malloc调用中的某些内容有关,但我不确定如何修复它。谢谢 TrainSet* get_train_set(float range){ TrainSet* t; printf("%f\n", range); t = malloc(range * sizeof *t); FILE *fp; char line
TrainSet* get_train_set(float range){
TrainSet* t;
printf("%f\n", range);
t = malloc(range * sizeof *t);
FILE *fp;
char line[300]; /* 300 is an arbitrary length to read in lines from the text file*/
int count = 0;
fp = fopen("Data/main_training_set.txt", "r");
if(fp == NULL){
perror("Error opening file");
return NULL;
}
while (fgets(line, 300, fp)){
// printf("%d\n", count);
int s = strlen((line)) - 3;
char* quote = (char*)malloc(sizeof(char) * s);
for(int i = 0; i <= s; i++){
quote[i] = line[i];
}
int label = atoi(&line[s]);
t->sentences[count] = quote;
t->labels[count] = label;
count ++;
}
//fclose(fp);
return t;
}
这是列车组的h文件
typedef struct TrainSet {
char* sentences[7892];
int labels[7892];
} TrainSet;
TrainSet* get_train_set(float range);
#endif /* READ_H*/*
输入数据本质上是这样的,一个在每行末尾都有一个整数的乱码句子
first four lectures taking place weekendand subject weekends talk five aggregates 1
relationship us thats simply want tobe happy dont want suffer 1
heard words songrecently said "i dont mind dying living scaresme 1
us know difficulties life trying somehowto minimize 1
char*quote=(char*)malloc(sizeof(char)*s);
对于(inti=0;ichar*quote=(char*)malloc(sizeof(char)*s);
对于(int i=0;i您正在写入quote
的末尾,并且可能写入t
的末尾
此循环:
for(int i = 0; i <= s; i++){
quote[i] = line[i];
}
不检查count
您写入的内容是否超过quote
的结尾,以及是否可能超过t
的结尾
此循环:
for(int i = 0; i <= s; i++){
quote[i] = line[i];
}
不检查count
是否看起来您的某个地方出现内存损坏。除非提供a,否则我们很难提供帮助。但对于初学者来说(int i=0;我考虑使用而不是fgets。无需任意内存分配。@Schwern该函数在非POSIX系统上可能不可用,在malloc()的大小计算中使用range
的浮点值
是非常不寻常的。不一定是错的,但不寻常的程度足以引起人们的关注。这意味着什么?它是如何使用的?为什么它不是一个合适的整数大小而不是一个浮点值?您为s
字符分配了内存,然后将s+1
字符复制到该内存中。并且没有增加也可以删除字符串。您还假设strlen(line)
大于3。基本上,您需要后退一步,并想出一个合理的计划来解析输入。看起来您的某个地方出现了内存损坏。除非提供了一个,否则我们很难提供帮助。但是对于初学者来说,(int i=0;我考虑使用而不是fgets。无需任意内存分配。@Schwern该函数在非POSIX系统上可能不可用,在malloc()的大小计算中使用range
的浮点值
是非常不寻常的。不一定是错的,但不寻常的程度足以引起人们的关注。这意味着什么?它是如何使用的?为什么它不是一个合适的整数大小而不是一个浮点值?您为s
字符分配了内存,然后将s+1
字符复制到该内存中。并且没有增加也可以删除字符串。您还假设strlen(line)
大于3。基本上,您需要后退一步,想出一个合理的计划来解析输入。@user3386109可能,但很难解释他为什么分配s
空格,复制(大致)s
字符,并传递了atoi
一个指向行的指针。你可能会认为那里的某个地方会有一个-3。但是没有注释(除了一个没有帮助的注释)和许多错误,很难确定。啊,你是对的。现在它更有意义了。很好。(更新答案。)很抱歉造成混淆,s逻辑用于获取每个引号末尾的整数,并将其添加到单独的标签列表中。引号需要添加到引号列表中。感谢您的建议!女性作家,顺便说一句@user3386109,但很难解释他为什么分配s
空格,复制(大致)s
字符,并传递了atoi
一个指向行的指针。你可能会认为那里的某个地方会有一个-3。但是没有注释(除了一个没有帮助的注释)和许多错误,很难确定。啊,你是对的。现在它更有意义了。很好。(更新答案。)很抱歉造成混淆,s逻辑用于获取每个引号末尾的整数,并将其添加到单独的标签列表中。引号需要添加到引号列表中。感谢您的建议!女作家,顺便说一句。感谢您的建议@MSN!奇怪的是,这在较小的尺寸下工作得非常好,现在我已经知道了我在看它,我不明白为什么会这样。你完全正确。我相信你可能没有注意到的原因是因为在C中访问数组的边界被认为是未定义的行为,所以上帝知道实际写入的是什么。感谢@MSN的建议!奇怪的是,它在更小的大小下工作得非常好,而我现在正在看它,我不明白为什么会这样。你完全正确。我相信你可能没有注意到的原因是因为在C中访问数组的边界被认为是未定义的行为,所以天知道实际上写了什么。
for(int i = 0; i <= s; i++){
quote[i] = line[i];
}
t->sentences[count] = quote;
t->labels[count] = label;