我在运行代码时遇到错误,该代码接受用户的温度并以相反的顺序打印,为啥会这样?
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>size)||(count==size))
也可以是if (count>=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
【讨论】:
以上是关于我在运行代码时遇到错误,该代码接受用户的温度并以相反的顺序打印,为啥会这样?的主要内容,如果未能解决你的问题,请参考以下文章