指向 nums 数组的指针不向函数传递任何数据

pointer to array of nums delivers no data to the function

嘿,代码的想法是扫描一个浮点数组,然后创建另一个函数,从头到尾打印该数组。由于某种原因,它只打印零。为什么它仍然引用我将数组设置为0的部分? -- float* arr = { 0 };

void ScansFloat(float* arr, int size);
void PrintsFloat(float* arr, int size);

int main()
{
    float* arr = { 0 };
    ScansFloat(arr, 5);
    PrintsFloat(arr, 5);
}

void ScansFloat(float* arr, int size)
{
    int save;
    arr = (int*)malloc(size * sizeof(int));
    for (int i = 0; i < size; i++)
    {
        printf("Enter number in position %d\n", i+1);
        scanf("%f", arr + i);
    }
}

void PrintsFloat(float* arr, int size)
{
    for (int i = size; i >= 0; i--)
    {
        printf("Number %d is %f\n", size - i +1, arr + i);
    }
}

传递指针的地址。

下面的代码不会改变调用代码的指针。

void ScansFloat(float* arr, int size) {
    ...
    // Here the prior value of `arr` is lost.
    arr = (int*)malloc(size * sizeof(int));  // Wrong type
    for (int i = 0; i < size; i++) {
      ...
      scanf("%f", arr + i);
    }
}

而是传递指针的地址。也是引用对象的大小,而不是类型。它避免了编码错误。

void ScansFloatAlternate(float** arr, int size) {  // **, not *
    ...
    // *arr = (int*)malloc(size * sizeof(int));
    *arr = malloc(sizeof **arr * size);
    if (*arr == 0) Handle_OutOfMemeory();
    for (int i = 0; i < size; i++) {
      ...
      scanf("%f", (*arr) + i);
    }
}

float* arr = 0; // or NULL
ScansFloatAlternate(&arr, 5);

注意:还可以进行其他常规改进。


也许是一种不同的方法:return 分配的指针。应用了各种改进。

// Return NULL on error
// Use size_t for sizing
float* ScansFloat(size_t n) {
  float *arr = malloc(sizeof *arr * n);
  if (arr) {
    for (size_t i = 0; i < n; i++) {
      printf("Enter number in position %zu\n", i + 1);
      if (scanf("%f", &arr[i]) != 1) {
        // Invalid input, so consume to the end of the line.
        int ch;
        while ((ch = getchar()) != '\n' && ch != EOF) {
          continue;
        }
        free(arr);
        return NULL;
      }
    }
  }
  return arr;
}

用法

// float* arr = { 0 };
// ScansFloat(arr, 5);
size_t n = 5;
float* arr = ScansFloat(n);
if (arr == NULL) Fail();
...
free(arr); // free when done