c - C 中的变量意外更改

标签 c dynamic-memory-allocation

我正在编写代码将一个数组拆分为 2 个不同的数组,一个包含偶数,一个包含奇数。我从文件中读取数字,将其全部放入一个数组中,然后正确拆分。这是一切正常的代码:

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

int main(int argc, char** argv){
  FILE* fpointer;
  if (argc >= 2){
    fpointer = fopen(argv[1], "r");
  }else{
    printf("No filename or multiple file names given");
    return 0;
  }
  int numElem;
  fscanf (fpointer, "%d\n", &numElem);
  printf("Number of elements is %d\n", numElem);
  int* arr;
  int numEvens;
  int numOdds;
  arr = (int*) malloc(numElem*sizeof(int));
  for (int i = 0; i < numElem; i++){
    int temp;
    fscanf(fpointer, "%d", &temp);
    if(temp%2 == 0){
       numEvens++;
    }else{
      numOdds++;
    }
    arr[i] = temp;
  }
  fclose(fpointer);

printf("number of evens: %d \n number of odds: %d\n", numEvens, numOdds);
  //The array is now in "arr"
   int* evens;
   int* odds;
   evens = (int*) malloc(numEvens*sizeof(int));
   odds = (int*) malloc(numOdds*sizeof(int));
  int a = 0;
  int b = 0;
  for (int i=0; i < numElem; i++){
    printf("%d\n", arr[i]);
    if (arr[i]%2 == 0){
      evens[a] = arr[i];
      a++;
    }else{
      odds[b] = arr[i];
      b++;
    }
  }
  printf("EVENS: %d\n", numEvens);
  for (int i=0; i < numEvens; i++){
    printf("%d\n", evens[i]);
  }
  printf("ODDS: %d\n", numOdds);
  for (int i=0; i < numOdds; i++){
    printf("%d\n", odds[i]);
  }

现在我有一个整齐的数组,其中包含偶数,一个包含奇数。它正确输出 numEvens 和 numOdds。然后我尝试对其进行排序:

  int temp;
  int x;
  int y;

  for (x = 0; x < numEvens-1; x++){
    for (y=x+1; y < numEvens; y++){
      if (evens[y] < evens[x]){
    temp = evens[y];
    evens[y] = evens[x];
    evens[x] = temp;
      }
    }
  }

  return 0;

}

在我添加排序方法之前的输出是:

Number of elements is 8
number of evens: 5 
 number of odds: 3
25
10
1
99
4
2
8
10
EVENS: 5
10
4
2
8
10
ODDS: 3
25
1
7

新的输出变成:

Number of elements is 8
number of evens: 32772 
 number of odds: 1764530596
25
10
1
99
4
2
8
10
EVENS: 32772
10
4
2
8
10
0
0
0
0
....

0 大概会再重复 32,000 次,直到我中止。我从 Java 毕业后正在尝试 C 语言,因此内存分配对我来说是一个新主题,但我假设它与此有关。我只是不明白变量在声明和打印后如何通过添加的代码行来更改。我真的不需要新排序方法的帮助,我只是想要一些关于这里发生的事情的指示,这样我就可以修复错误。提前致谢!

最佳答案

int numEvens;
int numOdds;

初始化你的变量:

int numEvens = 0;
int numOdds = 0;

...并且不要转换 malloc() 的结果!

关于c - C 中的变量意外更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52547411/

相关文章:

c - 在内存中压缩数据膨胀

c - C 新手 - 返回类型错误

c - 哪一种是正确的 Makefile 编写方法?

c - c 中的内存是如何分配的,为什么两个连续的内存之间的差异总是4?

c - MPI_Abort 和动态分配的内存

c++ - C++中的动态分配和大数据结构

c++ - 动态分配自定义类的数组并重载运算符

c - 递归返回一个值

c - Arduino IDE 在 Windows 中找不到 sys/time.h

c# - .net List<T> 修剪多余的部分