Как взять элементы массива указателей в C? - PullRequest
1 голос
/ 17 января 2020

Я пытаюсь создать массив указателей, который в моем случае может указывать на три элемента. Я хочу получить элементы во время выполнения и хочу получить доступ к каждому элементу, но не смог. Вот исходный код.

#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]);
    }
}

Ответы [ 3 ]

4 голосов
/ 17 января 2020

Измените

float *coefficient[3];

на

 float coefficient[3];

Поскольку вам нужен массив float, а не float указателей

Затем,

измените

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

на

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

Поскольку для чтения необходим указатель на число с плавающей точкой. Проверьте также возвращаемое значение из scanf

Как у вас есть массив с плавающей точкой

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

это то, что вам нужно

1 голос
/ 18 января 2020

Для стартеров в соответствии со стандартом C функция main без параметров должна быть объявлена ​​как

int main( void )

Вы объявили массив из трех указателей, но элементы массива не инициализированы и имеют неопределенные значения .

В результате вызов функции scanf в этом l oop

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 был успешным.

1 голос
/ 17 января 2020

Ваши указатели неинициализированы, поэтому разыменование их приводит к неопределенному поведению. Вам нужно выделить для них память, например, используя malloc().

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

И после того, как вы напечатаете их, вы должны использовать free() для освобождения памяти.

...