【问题标题】:C Array Behaviour - Global / Local / DynamicC 数组行为 - 全局/局部/动态
【发布时间】:2014-05-08 14:04:46
【问题描述】:

我在从 while 循环全局更新数组时遇到问题,如下所述。请注意,我只能使用 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);
     }
}

附言我只用 C 编写了 2 周,所以很简单很好:)

【问题讨论】:

  • 没有什么叫 C95,假设你的意思是 1995 年的 C90+AM1。在 C90+AM1 中强制转换 calloc 的结果是危险的,所以不要这样做。在 C99 中不再危险,只需 pointless

标签: c arrays malloc dynamic-arrays calloc


【解决方案1】:

在第一个代码块中,您分配了内存并将指向它的指针保存在“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() 为额外的两个获取空间。

【讨论】:

  • 感谢您的回复,我将如何更好地构建程序以避免这种情况?
  • @HenryQuekett 您根本不会在结构合理的程序中使用全局变量。相反,您可以将数组作为参数传递给函数。
  • 我不清楚您要做什么,但是...由于 x 和 y 数组的声明已经分配了内存,也许您可​​以将数据直接存储在这些数组中? (并完全删除 x_values 分配)
  • 不幸的是,我不能一起删除 x_values 和 y_values,因为它们被完整的程序使用这里是一个 pastebin 来帮助将代码放在上下文中 pastebin.com/ss6VgTCD
  • 没有最终使用该代码,但您在第 2 部分中的解释帮助我解决了我遇到的问题谢谢 :)
【解决方案2】:
          x_values = x;
          y_values = y;

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

【讨论】:

  • 在外面听起来很孤独!我如何将其引入/使其可在程序中使用?
  • @HenryQuekett 通过不写上面的错误。
猜你喜欢
  • 2023-03-30
  • 2015-10-04
  • 2011-09-17
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多