C阵列行为 - 全局/本地/动态

时间:2014-05-08 14:04:46

标签: c arrays malloc dynamic-arrays calloc

我遇到了从while循环全局更新数组的问题,如下面的expalined。请注意,我只能使用C 95及之前的功能。任何帮助将不胜感激!完整粘贴箱http://pastebin.com/ss6VgTCD

在我的程序顶部声明

int data_count, i;
float *x_values, *y_values;
float x[100],y[100];

在我的主要功能中,我的数组是使用以下代码创建的:

printf("\nPlease Enter How Many Data Points You Wish To Enter: \n");
scanf("%d", &data_count);
x_values=(float*)calloc(data_count,sizeof(*x_values));
y_values=(float*)calloc(data_count,sizeof(*y_values)); 
if (x_values==NULL) {
     printf("Error! Memory Could Not Be Allocated. ");
     exit(0);
}

文件读取功能用于导入先前输入的数据,该功能正在获取正确的数据并在我的调试行printf("%12f%12f\n", x_values[i], y_values[i]);中显示正确的数据点,但仅在本地更新x_valuesy_values因为这些导入的数据不能被程序的其余部分看到。如何全局更新阵列?

     void file_read(void) {
     store = fopen ("j:/StoredValues.txt", "r");
     if (store == NULL )
              printf("\nError: Failed To Open Previous Data File - Program Will Continue Anyway\n");
     else {
              printf("\nSuccess: Data From Previous Run Imported\n");
              i=0;
              do { 
              fscanf ( store, "%f,%f\n", &x[i], &y[i]);
              x_values = x;
              y_values = y;
              printf("%12f%12f\n", x_values[i], y_values[i]);
              i=i+1;
              } while (!feof(store));
              fclose(store);
     }
}

P.S。我只用C编码了2周,这很简单很好:)

2 个答案:

答案 0 :(得分:3)

在第一个代码块中,您已经分配了内存并将指针保存在' x_values'中。 在第二个块中,您可以更改' x_values'指向' x'阵列。 ' x'数组已经为100个浮点值分配了内存。

分配后,您将不再拥有指向已分配内存的指针。 存储在那里的任何数据都不再可访问,因为你不再有指向它的指针。

编辑:

这里建议替换file_read()例程:

void file_read(void) {
     store = fopen ("j:/StoredValues.txt", "r");
     if (store == NULL )
              printf("\nError: Failed To Open Previous Data File - Program Will Continue Anyway\n");
     else {
            printf("\nSuccess: Data From Previous Run Imported\n");
            float* px;
            float* py;
            px = x_values;
            py = y_values;
            while (!feof(store))
            {
                fscanf ( store, "%f,%f\n", px, py);
                printf("%12f%12f\n", *px, *py );
                px++;
                py++;
            }
              fclose(store);
     }
}

编辑2:

菜单选项2将显示x_values的内容。如果file_read()将内容放在x数组中,那么您无法使用选项2显示它。您也无法将x数组的内容复制到x_values,因为x_values尚不存在。

在尝试阅读之前,您需要为数据创建一个存储区域。 为此,您需要存储文件中的点数。

还要考虑:

用户输入10分,并为10分配空间。 然后用户想要输入新数据并想要输入12。 你现在必须使用free()和alloc()来获得额外的两个空间。

答案 1 :(得分:2)

          x_values = x;
          y_values = y;

这会导致x_values和y_values指向静态分配的数组,而不是动态为它们分配的数据。因此,在此分配之后,动态数据现在独立存在并作为内存泄漏在RAM中隔离,而不会从程序中引用它。