2016-12-22 6 views
0

Этот код компилируется с помощью Codeblocks в Windows, а когда я нажимаю 1 для запуска функции «Aggiungi» (Insert), я могу вставить только имя, фамилию и когда я нажимаю Enter после фамилии (поэтому, когда я должен вставить Tel), он сработает.C Структура с типом указателя символов не может вставить значение в функцию

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAX 100 

typedef struct rubrica 
{ 
    char *nome; 
    char *cognome; 
    char *tel; 
} rubrica; 

void aggiungi(rubrica *contatto, int ncont); 

int main(void) 
{ 
    rubrica *contatto[MAX]; 
    int act, ncont=0; 

    do 
    { 
     printf("1)AGGIUNGI\n"); 
     printf("2)VISUALIZZA\n"); 
     printf("0)ESCI\n"); 
     scanf("%d", &act); 

     if(act==1) 
     { 
      aggiungi(*contatto, ncont); 
      ncont++; 
     } 
    } while (act!=0); 

    return 0; 
} 

void aggiungi(rubrica *contatto, int ncont) 
{ 
    printf("\n________________\n"); 

    contatto[ncont].nome=malloc(21*sizeof(char*)); 
    printf("\nNome: "); 
    scanf("%s", contatto[ncont].nome); 

    contatto[ncont].cognome=malloc(21*sizeof(char*)); 
    printf("\nCognome: "); 
    scanf("%s", contatto[ncont].cognome); 

    contatto[ncont].tel=malloc(12*sizeof(char*)); 
    printf("\nTelefono: "); 
    scanf("%s", contatto[ncont].tel); 


} 
+0

Добро пожаловать в Stack Overflow! Похоже, вам, возможно, потребуется научиться использовать отладчик для выполнения вашего кода. С хорошим отладчиком вы можете выполнить свою программу по очереди и посмотреть, где она отклоняется от ожидаемого. Это важный инструмент, если вы собираетесь заниматься программированием. Дальнейшее чтение: [Как отлаживать небольшие программы] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+2

'categorya * contatto [MAX];' -> 'categorya contatto [MAX];', Затем 'aggiungi (* contatto, ncont);' -> 'aggiungi (contatto, ncont);' – BLUEPIXY

+2

Major: 'categorya * contatto [MAX]; 'не имеет памяти, выделенной ни одному из его элементов указателя. Minor: 'malloc (21 * sizeof (char *))' должно быть 'malloc (21 * sizeof (char))'. –

ответ

0

Как я вижу из декларации (rubrica *contatto[MAX];) contatto является массивом указателей, но ваш код приводит к идее, что вам нужен указатель на массив или просто массив структур (более вероятно).

Итак, мое предложение состоит в том, чтобы переделать декларацию данных.

Например, попробуйте следующее:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAX 100 

typedef struct rubrica 
{ 
    char *nome; 
    char *cognome; 
    char *tel; 
} rubrica; 

void aggiungi(rubrica *contatto, int ncont); 

int main(void) 
{ 
    rubrica contatto[MAX]; // array of items 
    int act, ncont = 0; 
    do 
    { 
     printf("1)AGGIUNGI\n"); 
     printf("2)VISUALIZZA\n"); 
     printf("0)ESCI\n"); 
     scanf("%d", &act); 
     if (act == 1) 
     { 
      aggiungi(contatto, ncont); // contatto is used without * 
      ncont++; 
     } 
    } while (act != 0); 
    return 0; 
} 

void aggiungi(rubrica *contatto, int ncont) // here *contatto is instead of contatto [] 
{ 
    printf("\n________________\n"); 

    contatto[ncont].nome = malloc(21 * sizeof(char*)); 
    printf("\nNome: "); 
    scanf("%s", contatto[ncont].nome); 

    contatto[ncont].cognome = malloc(21 * sizeof(char*)); 
    printf("\nCognome: "); 
    scanf("%s", contatto[ncont].cognome); 

    contatto[ncont].tel = malloc(12 * sizeof(char*)); 
    printf("\nTelefono: "); 
    scanf("%s", contatto[ncont].tel); 
} 
+0

Я сначала изменил аргумент, переданный в функции aggiungi в 'aggiungi (& contatto, ncont);', он работал, но с предупреждением и примечанием. По-твоему это прекрасно работает. Но я не понимаю, что происходит, когда я создаю простой массив, и передаю его функции как аргумент, но функция получила первый аргумент как указатель. –

+0

Массив распадается на указатель при передаче функции. –

+0

Значит, функция работает на указателе массива? –

1

Вы не выделить память для rubrica, вы только выделить память для указателя на него. Это вызывает недопустимый доступ к памяти для записи. Вы можете попробовать изменить

rubrica *contatto[MAX]; 

в

rubrica contatto[MAX]; 

и

aggiungi(*contatto, ncont); 

в

aggiungi(contatto, ncont); 
+0

Я уже пробовал таким образом, но он не будет компилироваться ... –

+0

Моя ошибка в том, что я также изменил аргумент функции! –

 Смежные вопросы

  • Нет связанных вопросов^_^