scanf структуры вызывает сбой программы - PullRequest
0 голосов
/ 07 ноября 2018

это код. Предполагается, что функция "leggi" читает значение c [i] .a, но когда я набираю первое число в консоли, программа вылетает. Это, вероятно, проблема с указателями, но я не могу понять это

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

typedef struct cane{
    int a;
}cane;

void leggi(cane *c[20]){
    int i;
    for(i=0;i<5;i++)
        scanf("%d", &c[i]->a );
}

int main(){
    int i;
    cane c[20];

    leggi(&c);

    for(i=0;i<5;i++)
        printf("%d",c[i].a);

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Тип &c равен cane (*)[20], то есть указатель на массив. Вы объявили аргумент функции cane *[20], который (в качестве аргумента функции) является cane**, который является указателем на указатель.

Возможно, вы намеревались передать указатель на элемент массива:

void leggi(cane *c)
    // ...
    scanf("%d", &c[i].a );

//
leggi(c);

Или, возможно, вы действительно намеревались вместо этого передать указатель на массив:

void leggi(cane (*c)[20])
    scanf("%d", &(*c)[i].a )

//
leggi(&c);
0 голосов
/ 07 ноября 2018

Вы передали неправильный тип функции.

Если вы хотите передать массив функции, имя массива затухает до указателя на его первый элемент, поэтому аргумент является только указателем на тип:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

typedef struct cane{
    int a;
}cane;

void leggi(cane *c){
    int i;
    for(i=0;i<5;i++)
        scanf("%d", &(c[i].a) );
}

int main(){
    int i;
    cane c[20];

    leggi(c);

    for(i=0;i<5;i++)
        printf("%d",c[i].a);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...