1

Я пытался использовать структуру с двумя указателями как массив структур. Он работал нормально, когда я пишу весь код в main(). Ниже приводится рабочий код:Доступ к структурам с двумя указателями в функции

[email protected] cat struct2.c 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <malloc.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <signal.h> 

typedef struct conn_s{ 
    int no; 
    char name[32]; 
}conn_t; 
int main(){ 
    int i=0, n; 
    conn_t **connections; 
    printf("How many students?\n"); 
    scanf("%d", &n); 
    for(i=0;i<n;i++){ 

    connections[i] = (conn_t*)malloc(sizeof(conn_t)); 
      printf("Enter no,name of student\n"); 

      scanf("%d%s", &connections[i]->no, &connections[i]->name); 
    } 

    printf("The student details you entered are"); 
    for(i=0;i<n;i++){ 
      printf("%d  %s", connections[i]->no, connections[i]->name); 
      free(connections[i]); 
    } 

    return 1; 
} 

[email protected] 
[email protected] ./struct2 
How many students? 
3 
Enter no,name of student 
1 pavan 
Enter no,name of student 
2 suresh 
Enter no,name of student 
3 ramesh 
The student details you entered are1  pavan2  suresh3  ramesh 

Но, когда я использую один и тот же код в функции он не работает.

[email protected] cp struct2.c struct1.c 
[email protected] vi struct1.c 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <malloc.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <signal.h> 

typedef struct conn_s{ 
    int no; 
    char name[32]; 
}conn_t; 
int data(){ 
    int i=0, n; 
    conn_t **connections; 
    printf("How many students?\n"); 
    scanf("%d", &n); 
    for(i=0;i<n;i++){ 

    connections[i] = (conn_t*)malloc(sizeof(conn_t)); 
      printf("Enter no,name of student\n"); 

      scanf("%d%s", &connections[i]->no, &connections[i]->name); 
    } 

    printf("The student details you entered are"); 
    for(i=0;i<n;i++){ 
      printf("%d  %s", connections[i]->no, connections[i]->name); 
      free(connections[i]); 
    } 

    return 1; 
} 

int main(){ 
    data(); 
return 1; 
} 
Entering Ex mode. Type "visual" to go to Normal mode. 
:wq 
"struct1.c" 41L, 874C written 
[email protected] gcc -o struct123 struct1.c 
[email protected] ./struct123 
How many students? 
3 
Segmentation fault 
[email protected] 

Не могли бы вы помочь мне в понимании проблемы.

+0

Кто-то любит ВИМ :) – Ben

+1

* Всегда * использовать 'НКУ -Wall -Werror '. Ваша жизнь будет намного лучше. –

+0

Я также предлагаю '-Wextra', а также' -std = gnu99 -pedantic'. – melpomene

ответ

2
connections[i] = ... 

Эта строка читается из переменной connections, которая неинициализирована. Это приводит к неопределенному поведению в обеих программах. (Это означает, что все может произойти, в том числе появление на «отлично работает».)

Вы можете исправить это, выполнив

connections = malloc(n * sizeof *connections); 

перед циклом.


Кстати:

  • <malloc.h> не стандартный заголовок
  • Вы не должны отбрасывать malloc
  • Вы должны проверить на наличие ошибок (scanf может потерпеть неудачу, malloc может потерпеть неудачу, и т.д. .)
  • 1 не является переносным статусом выхода/main возвращаемое значение (1 указывает на ошибку в unix и windows, но единственными портативными кодами являются 0 и EXIT_SUCCESS для успеха и EXIT_FAILURE за ошибки).
  • Переходя &connections[i]->name к scanf%s неправильно: %s занимает char * но &connections[i]->name является char (*)[32] (чтобы это исправить, удалить &)
+0

В режиме реального времени я не знаю, сколько записей мне нужно хранить. – pavan