【问题标题】:How to take the elements of pointer array in C?如何在C中获取指针数组的元素?
【发布时间】:2020-01-17 20:31:50
【问题描述】:

我正在尝试创建一个指针数组,在我的情况下它可以指向三个元素。我想在运行时获取元素并想要访问每个元素,但我不能。这是源代码。

#include<stdio.h>

main(){
    int i;
    float *coefficient[3];
    for(i=0;i<=2;i++){
        scanf("%f",coefficient[i]);
    }
    for(i=0;i<=2;i++){
        printf("%f\n",*coefficient[i]);
    }
}

【问题讨论】:

  • coefficient本质上已经是一个指针。尝试声明float coefficient[3];而不是float *coefficient[3]
  • @RobertHarvey:他们还需要删除printf 中的*,并将scanf 更改为scanf("%f", &amp;coefficient[i]); 以匹配。我怀疑他们声明了一个指针数组仅仅是因为他们不明白你应该如何将参数传递给scanf(通常使用&amp; 来获取现有堆栈变量的地址)。

标签: c arrays pointers memory-management


【解决方案1】:

改变

float *coefficient[3];

 float coefficient[3];

因为你需要一个 float 而不是 float 指针的数组

那么,

改变

scanf("%f",coefficient[i]);

scanf("%f",&coefficient[i]);

因为您需要一个指向浮点数的指针才能读入。还请检查来自scanf的返回值

因为你有一个浮点数组

printf("%f\n",coefficient[i]);

是你需要的

【讨论】:

    【解决方案2】:

    您的指针未初始化,因此取消引用它们会导致未定义的行为。您需要为它们分配内存,例如使用malloc()

        for(i=0;i<=2;i++){
            coefficient[i] = malloc(sizeof *coefficient[i])
            scanf("%f",coefficient[i]);
        }
    

    并且打印出来之后,你应该使用free()来释放内存。

    【讨论】:

      【解决方案3】:

      对于根据 C 标准的初学者,不带参数的函数 main 应声明为

      int main( void )
      

      您声明了一个包含三个指针的数组,但该数组的元素未初始化并且具有不确定的值。

      结果在这个循环中调用了函数scanf

      for(i=0;i<=2;i++){
          scanf("%f",coefficient[i]);
      }
      

      调用未定义的行为。

      作为数组元素的指针应指向可以使用指针存储数据的有效内存。

      例如,您可以为每个指针动态分配将由相应指针指向的内存

      这是一个演示程序。

      #include <stdio.h>
      #include <stdlib.h>
      
      int main(void) 
      {
          enum { N = 3 };
          float  *coefficient[N];
      
          for ( size_t i = 0; i < N; i++ )
          {
              coefficient[i] = malloc( sizeof( float ) );
          }
      
          for ( size_t i = 0; i < N; i++ )
          {
              scanf( "%f", coefficient[i] );
          }
      
          for ( size_t i = 0; i < N; i++ )
          {
              printf( "%f\n", *coefficient[i] );
          }
      
          for ( size_t i = 0; i < N; i++ )
          {
              free( coefficient[i] );
          }
      
          return 0;
      }
      

      如果进入

      1.1
      2.2
      3.3
      

      那么输出会是这样的

      1.100000
      2.200000
      3.300000
      

      您可以随意格式化输出。

      一般来说,您应该检查malloc 和/或scanf 的调用是否成功。

      【讨论】:

      • 我最近使用int main() {...} 看到的问题(和答案!)似乎比以往任何时候都多,这里的OP 代码似乎根本不承认main() 返回一个值。嗯。也许这是一个复古计算的东西。 IAC,指出更健壮的代码检查malloc() 的失败并检查scanf() 返回的值可能会有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 2021-03-06
      相关资源
      最近更新 更多