Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 马洛克错配?_C - Fatal编程技术网

C 马洛克错配?

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

这里是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[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;i
char*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;