realloc删除已在C中的数组中的数据

时间:2017-04-04 20:41:57

标签: c arrays calloc

出于某种原因,当我重新分配使用calloc创建的数组的大小时,它会删除已经输入的值,也许还会发生其他事情,但我不明白为什么。我已经更改了代码,以便它包含它需要工作的所有内容,抱歉,我忘记了

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

int main(void) {
unsigned int arraySize; // size of array
int moreElements; // stores user input whether more elements are to be 
int additionalElements = 0; // number of elements to be added to array
unsigned int type; // stores the type of array
float sum = 0; // the sum of the elements
float *floatArrPtr; // pointer to a flaot

floatArrPtr = calloc(arraySize, sizeof(float));

for(size_t i = 0; i < arraySize; i++)
{
  printf("Please enter a number for the array: ");
  scanf("%f", &floatArrPtr[i]);
  printf("%f\n", floatArrPtr[i]);
}

for(size_t i = 0; i < arraySize; i++)
{
  sum += *(floatArrPtr+i);
}
sum /= arraySize;

printf("The average of the elements of the array is %lf\n", sum);

do
{
  printf("if there are more elements to be added enter 1 and 0 if not:         ");
  scanf("%d", &moreElements);
} while (moreElements != 0 && moreElements != 1);

if (moreElements == 1) {
  printf("please enter the number of additional elements you want to add: ");
  scanf("%d", &additionalElements);

  floatArrPtr = realloc(intArrPtr,(arraySize+additionalElements) * sizeof(float));
  for (size_t i = arraySize; i < arraySize+additionalElements; i++)
  {
    printf("Please enter a number for the array: ");
  scanf("%f", &floatArrPtr[i]);
  }

  sum = 0;
  for(size_t i = 0; i < arraySize+additionalElements; i++)
  {
    sum += *(floatArrPtr+i);
    printf("%zu, %lf, %d\n", i, floatArrPtr[i], arraySize + additionalElements);
  }
  sum /= (arraySize + additionalElements);

  printf("The average of the elements of the array is %lf\n", sum);
}
}

1 个答案:

答案 0 :(得分:2)

顶部的calloc代码是错误的。对于arraySize为1000,它分配一百万个浮点数,或4MB。看那个。

然后我假设真正的问题是从早期代码中滑入的intArrayPtr。

使用功能,他们付出了代价。 - 我的意思是让每个函数的所有代码都不超过4行,这样就可以阻止早期的旧变量滑入。

错误的行是

 floatArrPtr = realloc(intArrPtr...

你需要

floatArrPtr = realloc(floatArrPtr...

我不知道intArrPtr的目的,但看起来如果该代码编译它是从上面的代码进来的。

你有全局变量。一个人必须非常小心他们,因为他们最多是痛苦,最坏的情况是他们会造成无法预料的边缘情况,这就是你所拥有的。

让你的项目有两个文件,一个用于整数,一个用于浮点数,你会在编译器中看到你的错误。