我在运行代码时遇到错误,该代码接受用户的温度并以相反的顺序打印,为啥会这样?

Posted

技术标签:

【中文标题】我在运行代码时遇到错误,该代码接受用户的温度并以相反的顺序打印,为啥会这样?【英文标题】:I am running into an error while running my code, which accepts temperatures from user and prints in reverse order, why is that so?我在运行代码时遇到错误,该代码接受用户的温度并以相反的顺序打印,为什么会这样? 【发布时间】:2021-12-04 21:09:42 【问题描述】:

我正在编写这个代码,作为家庭作业,以满足以下要求:

(不允许使用函数 realloc)

最初分配一个数组以容纳最多 5 个温度。

提示用户输入温度并在完成后键入值 -100.0。

如果用户填满了你的程序应该填满的数组 动态分配一个两倍大小的新数组。

将旧值复制到新数组中。 释放旧数组。

继续读入新数组。

读完数组后,您的程序应该像以前一样,以小数点后 1 位的精度和输入末尾的新行输出反向读取的温度(从最新到最旧)

这是我的方法:

#include <stdio.h>
#include <stdlib.h>

int main(void)

int size = 5;
float *temperature_first = malloc(sizeof(float)*size);
float *temperature_second;
float inputArray;
int switch_array = 0;
int count = 0;

printf("'Please enter temperature; type '-100' to end: ");
while(inputArray !=-100)

  while((inputArray != -100)&&(count<=size))
    if(switch_array==0)

      scanf("%f", &temperature_first[count]);
      inputArray = temperature_first[count];
    

    else
      scanf("%f", &temperature_second[count]);
      inputArray = temperature_second[count];
    
    count++;
    
    if((count>=size))

      size  = size*2;

      if(switch_array==0)
      temperature_second = malloc(sizeof(float)*size);
      for(int elements = 0;elements<(size/2)+1;elements++)

        temperature_second[elements] = temperature_first[elements];
      
        free(temperature_first);

        switch_array = 1;
      
      else
        temperature_first = malloc(sizeof(float)*size);
        for(int elements = 0;elements<(size/2)+1;elements++)

          temperature_first[elements] = temperature_second[elements];

        

          free(temperature_second);

          switch_array = 0;
    
  

for(int i = count-2;i>-1;i--)
  if(i==0)
  if(switch_array==0)
  
    printf("%0.1f", temperature_first[i]);
   
   else
     printf("%0.1f", temperature_second[i]);
   
  
  else
    if(switch_array==0)
      printf("%0.1f ", temperature_first[i]);
    
    else
      printf("%0.1f ", temperature_second[i]);
    
  

printf("\n");

if(switch_array==0)
  free(temperature_first);

else
  free(temperature_second);

return 0;
 

在运行特定测试时: 输入:16.5 18.8 20.5 21.3 16.2 15.0 17.0 19.7 21.2 56.3 12.5 44.5

以下行用于编译:

gcc -Wall -Werror=vla -std=c11 -o temperatures02 temperatures02.c

这就是我遇到的:

malloc(): corrupted top size
Aborted (core dumped). 

我不太清楚为什么。

任何帮助将不胜感激。

谢谢!

【问题讨论】:

欢迎来到 SO。请不要同时标记 C 和 C++,除非您同时使用它们。它们是非常不同的语言。不鼓励添加图片。相反,您可以直接将文本复制并粘贴到问题中。 作为一般规则,您应该打开编译器警告。对于 Gcc,您可以使用 -Wall -Wextra 执行此操作。您应该收到一些关于“使用inputArray 而不分配任何值”的警告。这个if((count&gt;size)||(count==size)) 也可以是if (count&gt;=size) 关于任务......分配、复制和释放......从来没有听说过realloc 我认为你让它变得比需要的复杂得多。不要随身携带 2 个阵列。只需使用一个并根据需要进行更新。只有在“alloc+copy+dealloc”期间你才需要第二个指针。 @Gerhardh,非常感谢您的帮助。只是我们不允许使用 realloc 函数(我很抱歉忘了把它放在条件中)。我对我的代码进行了一些更改,但是我仍然没有得到想要的输出。如果你能帮帮我好吗? 【参考方案1】:

你只是没有分配足够的内存:

    if((count>size)||(count==size))

      size  = size*2;

      if(switch_array==0)
      temperature_second = malloc(sizeof(float)*count);

您需要size 而不是count。否则,您的条目 count .. size-1 将最终出现在您不拥有的内存中。

您的代码的更短版本可能如下所示:

#include <stdio.h>
#include <stdlib.h>

int main(void)

  int size = 5;
  float *temperatures = malloc(sizeof(float)*size); // TODO: Check for NULL
  float temperature;
  int count = 0;

  printf("Please enter temperature; type '-100' to end: ");
  scanf("%f", &temperature);
  // TODO: Check result for error!

  while (temperature != -100) 
    temperatures[count] = temperature;
    count++;

    if (count == size) 
      size *= 2;
#if DO_IT_LIKE_THE_TASK_DEMANDS_IT
      float *newarray = malloc(sizeof(float)*size);
      // TODO: Check for NULL!
      for (int i = 0; i < count-1; i++) 
        newarry[i] = temperatures[i];
      
      free(temperatures);
#else
      float *newarray = realloc(temperatures, sizeof(float)*size);
      // TODO: Check for NULL!
#endif
      temperatures = newarray; 
    

    printf("Please enter temperature; type '-100' to end: ");
    scanf("%f", &temperature);
    // TODO: Check result for error!
  

  // Print them backwards (not in the task but in your code
  // Last element was put into temperatures[count] before we did count++.
  // Therefore now we need to start at index count-1, not count-2

  for(int i = count-1;i>-1;i--) 
    if (i==0) 
      printf("%0.1f", temperatures[i]);
    
    else 
      printf("%0.1f ", temperatures[i]);
    
  
  printf("\n");

  free(temperatures);
  return 0;
 

在https://www.onlinegdb.com/online_c_compiler 测试显示:

Please enter temperature; type '-100' to end: 16.5
Please enter temperature; type '-100' to end: 18.8
Please enter temperature; type '-100' to end: 20.5
Please enter temperature; type '-100' to end: 21.3
Please enter temperature; type '-100' to end: 16.2
Please enter temperature; type '-100' to end: 15.0
Please enter temperature; type '-100' to end: 17.0
Please enter temperature; type '-100' to end: 19.7
Please enter temperature; type '-100' to end: 21.2
Please enter temperature; type '-100' to end: 56.3
Please enter temperature; type '-100' to end: 44.5
Please enter temperature; type '-100' to end: -100
44.5 56.3 21.2 19.7 17.0 15.0 16.2 21.3 20.5 18.8 16.5


...Program finished with exit code 0

【讨论】:

以上是关于我在运行代码时遇到错误,该代码接受用户的温度并以相反的顺序打印,为啥会这样?的主要内容,如果未能解决你的问题,请参考以下文章

出错时停止代码执行 (C++)

我在我的项目中运行 Nodemon 时遇到问题[关闭]

运行时遇到错误(域 = LaunchServicesError,代码 = 0)[重复]

为啥我在尝试执行时间戳用户定义函数时遇到运行时错误(范围)

OCaml 用户定义类型和函数返回错误

我在尝试运行 Appium 测试时遇到错误