Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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_Dynamic Memory Allocation - Fatal编程技术网

C中的变量意外地改变

C中的变量意外地改变,c,dynamic-memory-allocation,C,Dynamic Memory Allocation,我正在编写一个代码,将数组分成两个不同的数组,一个是偶数,另一个是奇数。我从一个文件中读取数字,将其全部放入一个数组中,然后得到正确的分割。以下是所有工作的代码: #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv){ FILE* fpointer; if (argc >= 2){ fpointer = fopen(argv[1], "r"); }else{

我正在编写一个代码,将数组分成两个不同的数组,一个是偶数,另一个是奇数。我从一个文件中读取数字,将其全部放入一个数组中,然后得到正确的分割。以下是所有工作的代码:

#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]);
  }
新的输出变成:

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大概还会继续运行32000次,直到我中止。从java毕业后,我正在尝试C语言,所以内存分配对我来说是一个新课题,但我假设它与此有关。我只是不明白在声明和打印变量之后,如何通过添加代码行来更改变量。我真的不需要新排序方法的帮助,我只需要一些关于这里发生的事情的指针,这样我就可以修复错误。提前谢谢

初始化变量:

int numEvens = 0;
int numOdds = 0;
。。。不要强制转换malloc()的结果。

初始化变量:

int numEvens = 0;
int numOdds = 0;


。。。不要强制转换malloc()的结果。

使用调试器并逐步完成排序代码。您处理的是数组中的一小部分项,这意味着您可以轻松地逐行检查每一行和重复,以查看出了什么问题。我目前正在自学如何使用调试器,遗憾的是没有eclipse的那么简单。但我发这篇文章是希望在我把它投入工作的时候有人能帮我。我无法重现你的错误。我用给定的输入尝试了您的代码,似乎一切都正常。您发布的内容与编译的内容不同,或者您的输入文件与给定的内容不同。到目前为止,我觉得一切都是对的。好吧,我不是疯了?我一行一行地浏览了一遍,找不到错误。我复制并粘贴了代码,因此这正是编译的内容,我正在使用gcc编译器,因此编译器本身工作正常。输入文件是一个整数,然后在另一行上,它的多个整数由一个制表符分隔。初始数组过程中
numEvens
numods
的计数器未初始化,因此它们包含不确定的内容,并对其进行递增、计算,几乎任何事情都会调用未定义的行为。仅供参考,一个有学究式警告的体面的编译器很可能会警告你这一点。使用调试器并逐步完成你的排序代码。您处理的是数组中的一小部分项,这意味着您可以轻松地逐行检查每一行和重复,以查看出了什么问题。我目前正在自学如何使用调试器,遗憾的是没有eclipse的那么简单。但我发这篇文章是希望在我把它投入工作的时候有人能帮我。我无法重现你的错误。我用给定的输入尝试了您的代码,似乎一切都正常。您发布的内容与编译的内容不同,或者您的输入文件与给定的内容不同。到目前为止,我觉得一切都是对的。好吧,我不是疯了?我一行一行地浏览了一遍,找不到错误。我复制并粘贴了代码,因此这正是编译的内容,我正在使用gcc编译器,因此编译器本身工作正常。输入文件是一个整数,然后在另一行上,它的多个整数由一个制表符分隔。初始数组过程中
numEvens
numods
的计数器未初始化,因此它们包含不确定的内容,并对其进行递增、计算,几乎任何事情都会调用未定义的行为。仅供参考,一个学究式的警告达到极限的体面编译器很可能会警告你这一点。Doh!是的,我没看到@LightAlchest增加了你最喜欢的编译器的警告级别。太棒了,这是C和Java之间的另一个不同之处,我一定要记住,未初始化的变量与初始化为0不同。我看到了错误,但是我能问一下为什么我不应该强制转换malloc的结果吗?@swardfish我用没有优化标志的gcc-Wall-Wextra test.c编译了它,所以警告没有弹出。我用gcc-Wall-Werror-fsanizize=address。我很确定最后一个标志就是捕捉我所有错误的标志!是的,我没看到@LightAlchest增加了你最喜欢的编译器的警告级别。太棒了,这是C和Java之间的另一个不同之处,我一定要记住,未初始化的变量与初始化为0不同。我看到了错误,但是我能问一下为什么我不应该强制转换malloc的结果吗?@swardfish我用没有优化标志的gcc-Wall-Wextra test.c编译了它,所以警告没有弹出。我用gcc-Wall-Werror-fsanizize=address。我很确定最后一个标志就是捕捉我所有错误的标志。
int numEvens;
int numOdds;
int numEvens = 0;
int numOdds = 0;