2017-07-21 29 views
0

如何爲結構中的我的char *字段分配內存?如何分配char *字段結構中的內存

我的結構:

struct student{ 
    int score; 
    char* name; 
    char* surname; 
}; 
int main(){ 
    struct student st[]; 
    int i; 
    int n = 5; 
    for(i = 0; i < n; i++){ 
     printf("Score: \n"); 
     scanf("%d", &st[i].score); 
     printf("Name \n"); 
     scanf("%s", &st[i].name); 
     printf("Surname \n"); 
     scanf("%s",&st[i].surname) 
    } 

} 

如何的malloc到char* namechar* surname
我必須有一個結構數組struct student st[]

我不知道,這是怎麼理性的。

void initialise_student(struct student *st, char* name, char* surname) 
    { 
    st->name = (strlen(name) + 1); 
    st->surname = (strlen(surname) +1); 
    } 
    int main(){ 
    int i; 
    int n = 5; 
    struct student *st[n] = initialise_student(); 
    for(i = 0; i < n; i++){ 
     printf("Score: \n"); 
     scanf("%d", &st[i].score); 
     printf("Name \n"); 
     scanf("%s", &st[i].name); 
     printf("Surname \n"); 
     scanf("%s",&st[i].surname); 
     } 

如何配合?

+0

字符串從哪裏來? –

+0

字符串來自鍵盤scanf –

+0

你想如何爲未知長度的字符串分配空間? –

回答

0

您需要編寫一個initialise_student(struct student* s)函數,該函數在char*成員上調用malloc。也許這個功能也需要namesurnamechar* pointers其中你有深刻的副本?

然後,您可以使用st數組的每個成員調用此函數。

不要忘記建立一個相應的free_student(struct student* s)函數。

+0

這不是一個答案。你所說的是:「在函數內部使用malloc」 –

+0

@TonyTannous:我們會同意不同意(尊重,自然)。這個答案很像早期的C++編譯器如何工作。 – Bathsheba

+0

@Bathsheba'free_student(struct student * s)'必須在循環後啓動並顯示完整結果,或者必須在顯示循環中? –

3

例如

#include <stdlib.h> 
#include <string.h> 

//... 

struct student st[1]; 
char *name = "Marek"; 
char *surname = "Piszczaniuk"; 

st[0].name = malloc(strlen(name) + 1); 
strcpy(st[0].name, name); 

st[0].surname = malloc(strlen(surname) + 1); 
strcpy(st[0].surname, surname); 

st[0].score = 100; 

可以編寫單獨的函數來設置數據成員姓名的數組的元素。

例如

_Bool set_name(struct student *st, const char *name) 
{ 
    st->name = malloc(strlen(name) + 1); 
    _Bool success = st->name != NULL; 

    if (success) 
    { 
     strcpy(st->name, name); 
    } 

    return success; 
} 
+0

我可以試試這個例子初始化malloc結構嗎?我知道這個快速的例子,但我逐漸理解它。 –

+0

@MarekPiszczaniuk是的你可以。但它會被正確地說是用一個字符串初始化結構的數據成員。 –

0

如果您已經使用scanf,您可以通過使用%ms代替%s,這樣告訴函數分配刺痛你:

char *name; 
if (scanf("%ms", &name) != 1) { 
    fprintf(stderr, "error: could not read name\n"); 
    exit(1); 
} 

編輯這可能不是有效的解決方案 - 我忘記了%ms僅在POSIX中,而不是在ISO C.

+3

這不是標準C的一部分,而是POSIX擴展。 –