2013-03-14 69 views
-1

我第一次使用C中的結構,並且我討厭承認我不認爲我很好地理解它。我正在嘗試構建一個指向Student結構的指針數組,以創建學生的整個數據庫。問題是,如果我創造了多於一名學生,那麼第一批學生的名字和課程會被第二名學生覆蓋。此外,名稱上的輸出只是非常奇怪。如果我給「Sarah」這個名字,我會回到「Sara?LG ?? fa?e」但是這些課程表現良好。我覺得我可能會在內存分配方面做錯了什麼?我們也傾向於這一點,而且我也不瞭解它100%。用結構覆蓋字符數組

這裏的代碼我的工作,現在部分:

typedef struct student Student; 

struct student 
{ 
    char *name; 
    int age; 
    char *course1; 
    char *course2; 
}; 

Student *Data[30]; 
int count = 0; 

void new() 
{ 
    int age; 
    char name [300]; 
    char course1 [300]; 
    char course2 [300]; 
    char together[300]; 
    char remarks[300]; 

    printf("name: "); 
    scanf("%s", name); 

    printf("age: "); 
    scanf("%d", &age); 

    printf("course-1: "); 
    scanf("%s", course1); 

    printf("course-2: "); 
    scanf("%s", course2); 

    Data[count] = malloc(sizeof(Student)); 
    Data[count]->name = name; 
    Data[count]->age = age; 
    Data[count]->course1 = course1; 
    Data[count]->course2 = course2; 
    count++; 

} 

void display() 
{ 

    int i; 
    for(i=0; i<count; i++) 
    { 
     printf("name:\t%s\n", Data[i]->name); 
     printf("age:\t%d\n", Data[i]->age); 
     printf("course1:\t%s\n", Data[i]->course1); 
     printf("course2:\t%s\n", Data[i]->course2); 
    } 


} 

感謝您的幫助大家:)

回答

0

你只是複製引用(指針)的數據,這意味着你的舊數據丟失。你需要複印

Data[count]->name = (char*)malloc(...); 
strcpy(Data[count]->name,name); 

1

哦,你不分配個人Student任何地方的內存。如果字段的大小是已知的,你可以聲明倉儲爲一體的結構的一部分:

struct student 
{ 
    char name[300]; 
    int age; 
    char course1[300]; 
    char course2[300]; 
}; 

然後如下填充它:

Data[count] = malloc(sizeof(Student)); 
strncpy(Data[count]->name, name, sizeof(Data[count]->name)); 
Data[count]->age = age; 
strncpy(Data[count]->course1, course1, sizeof(Data[count]->course1)); 
strncpy(Data[count]->course2, course2, sizeof(Data[count]->course2)); 

如果要使用動態內存分配,那麼結構應爲它是現在,但分配的改變:

Data[count] = malloc(sizeof(Student)); 
Data[count]->name = strdup(name); 
Data[count]->age = age; 
Data[count]->course1 = strdup(course1); 
Data[count]->course2 = strdup(course2); 

.... 

當你解除分配,不要忘記領域:

free(Data[count]->name); 
free(Data[count]->course1); 
free(Data[count]->course2); 
free(Data[count]); 
0

這是...不是處理結構中指針的正常方法。您將結構中的指針設置爲本地靜態分配的數組。你想要做的是malloc()內存爲每個陣列的結構成員的,例如:

void new() 
{ 

    printf("name: "); 
    Data[count]->name = malloc(300); 
    scanf("%299s", Data[count]->name); 

但是當你與你的代碼做你現在必須釋放所有的結構元素的內存以及作爲結構本身。


現在,如果你想獲得一個小票友,你要只gcc編譯就可以使用%a%m修飾符(根據標準)跳過mallocs:

printf("name: "); 
    scanf("%m", Data[count]->name); 

但是,當然,你必須自己釋放它。