2016-03-31 5 views
-3

Я исправил его!Я не могу получить доступ к массиву внутри структуры

typedef struct student 
{ 
char id[11]; 
}Student; 

#include<stdio.h> 
#include<stdlib.h> 
int main(int argc, char **argv){ 
int input = 0, i = 0; 
FILE * fp = fopen("student.txt", "wt"); 

if (fp == NULL) { 
    printf("Error to open student.txt"); 
    return -1; 
} 
scanf("%d",&input); 

student = (Student *)malloc(input*sizeof(Student)); 

     for(i=0;i<input;i++){ 
     strcpy(student[i].id, "a"); // A is just for default. 
     fprintf(fp,"%s\n",student[i].id); 
} 
fclose(fp); 
return 0; 
}   

Я исправил комментарии и добрые ответы. И это действительно работает

Спасибо за помощь

я действительно оценил его! Это было действительно полезно.

+1

Что такое 'student'? –

+1

Почему 'student = (Student *) malloc (input * sizeof (Student));' выполняется в цикле? Вы просто перенаправляете новый адрес на тот же указатель, который будет утечка предыдущих распределений, которые вы не освободили. – Michael

+1

Пожалуйста, напишите [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) –

ответ

5

Несколько примечаний:

С:

for (i=0; i<input; i++) 
    student = ... 

Вы неоднократно отвергая значение student.

Это довольно много, как делают:

x = 5; 
x = 6; 
x = 7; 
... 

Не только это, но во время процесса вы также принуждая многочисленные утечки памяти на себя.

С помощью student = malloc(...) вы выделяете новый блок памяти на каждой итерации, а затем устанавливаете эту переменную для указания на этот блок памяти, «забывая» предыдущий (который вы больше не сможете освободить).

+0

Я сделал огромную ошибку, чтобы сбить с толку массив [] []. Спасибо. –

+0

@ChrisPark: Добро пожаловать. Из-за этой самой основной ошибки я не упомянул о остальном вашем коде. Я надеюсь, что вы сможете самостоятельно разобраться с остальными. –

1

Этот id[0] = "" не имеет никакого смысла. Ваш компилятор должен дать ошибку компилятора для этого, или он неверно сконфигурирован/нарушен.

Чтобы присвоить значение строке, используйте strcpy(student[i].id, "").

Также, как указал кто-то, malloc не должен находиться внутри петли. Просто отбросьте первый цикл и используйте один вызов malloc. И не делайте результат из malloc, потому что делать это бессмысленно.

Student* student = malloc(sizeof(Student[input])); 

В конце программы (когда из школы) добавить free(student).

+0

Это не единственное, что не имеет смысла в этом фрагменте кода. –

+0

@MichaelWalz Обновлен ответ для полноты. – Lundin

+0

@RajeevSingh Очевидно, что должна быть объявлена ​​переменная, называемая 'student'. – Lundin

1

Не совсем уверен, что вы просите, но, может быть, вам это нужно:

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

typedef struct student 
{ 
    char id[11];    
} Student; 


int main(int argc, char **argv){ 
    int nbstudents = 0; 
    int i; 

    printf ("How many students do you want: "); 
    scanf("%d",&nbstudents); 

    Student *studentarray = malloc(nbstudents * sizeof(Student)); 

    for(i = 0; i < nbstudents; i++) 
    { 
    printf ("Enter student id %d: ", i); 
    scanf("%s", studentarray[i].id); 
    } 

    printf ("Students ids entered:\n"); 

    for(i = 0; i < nbstudents; i++) 
    { 
    printf ("Student id %d: %s\n", i, studentarray[i].id); 
    } 

    free(studentarray); 

    return 0; 
} 

Ths student структура должна, вероятно, содержат другие поля, чем id, например, имя студента.

+0

@ Lundin исправил спасибо, вы можете удалить комментарий. –

+0

ах .. Да, это то, чего я хочу. Но как я могу изменить данные без использования функции scanf –

+0

@ChrisPark: вы можете использовать 'strcpy':' strcpy (studentarray [i] .id, "SOMEID"); '. Но 'studentarray [i] .id =" SOMEID ";' не будет работать. –