2016-03-31 27 views
-3

Onarıyorum!Yapıdaki diziye erişemiyorum

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; 
}   

Yorumlardan ve türden yanıtlardan düzelttim. Ve yardım

için

Teşekkür çalışır

ben gerçekten takdir! Gerçekten faydalıydı.

+1

Öğrenci nedir? –

+1

Neden öğrenci = (Öğrenci *) malloc (input * sizeof (Öğrenci)); 'bir döngü içinde mi? Aynı göstergeye yeni bir adres atayacaksınız, ki boş bırakmamış olduğunuz önceki tahsisleri sızdırıyor olacak. – Michael

+1

Lütfen [Minimal, Tam ve Doğrulanabilir örnek] (http://stackoverflow.com/help/mcve) –

cevap

5

birkaç not:

olarak:

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

art arda student değerini geçersiz kılma.

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

Sadece bu değil, ama işlem sırasında siz de kendiniz üzerine sayısız bellek sızıntılarını zorluyor:

O yapıyor gibi oldukça fazla.

student = malloc(...) ile, her bir yinelemede yeni bir bellek bloğu ayırıyorsunuz ve ardından bu değişkeni bir öncekini "unutmak" (yani artık ayrılamayacaksınız) sırasında bu bellek bloğunu işaret edecek şekilde ayarlıyorsunuz.

+0

Ben dizi [] [] ile karıştırmak için büyük bir hata yaptım. Teşekkürler. –

+0

@ChrisPark: Rica ederim. Bu çok temel hata nedeniyle kodunuzun geri kalanına başvurmadım. Umarım gerisini kendi başınıza halledebilirsin. –

1

Bu id[0] = "", herhangi bir anlam ifade etmemektedir. Derleyiciniz bunun için bir derleyici hatası vermeli veya yanlış yapılandırılmış/bozuk olmalıdır.

Dizeye değer atamak için strcpy(student[i].id, "") kullanın. Ayrıca, birisinin işaret ettiği gibi, malloğun bir döngü içinde olmaması gerekir. Sadece ilk döngü için bırakın ve tek bir malloc çağrı kullanın. Ve sonucu mallocdan yapma, çünkü bunu yapmak anlamsız. Programın (okulun dışında olduğunda) free(student) eklemek sonunda

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

.

+0

Bu kod parçasında anlam ifade etmeyen tek şey bu değil. –

+0

@MichaelWalz Tamlık için yanıtı güncellendi. – Lundin

+0

@RajeevSingh Açıkçası, “öğrenci” olarak adlandırılan bir değişken olması gerekiyor. – Lundin

1

değil soruyorsun, ama belki de bunu gerekenleri oldukça emin:

#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 yapı örneğin, öğrencinin adını id dışındaki alanlar muhtemelen içermelidir.

+0

@Lundin düzeltildi, siz de yorumu silebilirsiniz. –

+0

ah .. Evet, istediğim bu. Ancak scanf işlevini kullanmadan verileri nasıl değiştirebilirim? –

+0

@ ChrisPark: strcpy': strcpy (studentarray [i] .id, "SOMEID"); Ama 'studentarray [i] .id = "SOMEID"; 'çalışmıyor. –