2010-01-02 105 views
0

如果作爲參數發送給函數,如何添加記錄?如何在C編程語言的函數中添加記錄(結構體)?

struct record { 
char name[20]; 
int nr; 
}; 

void AddRecord(struct record **p_allRecs, int p_size); 

int main() { 

struct record *allRecs; 
/* putting in some records manually, size++... */ 
allRecs = (struct record *)malloc(size*sizeof(struct record)); 
} 

AddRecord(&allRecs, size);/* wan't to add a record like this */ 
}/* end main */ 

void AddRecord(struct myRecord **p_allRecs, int p_size){ 
int i; 
struct record *allRecsTemp; /* temporary */ 
allRecsTemp = (struct record *)malloc((p_size+1)*sizeof(struct record));/* oneup */ 
/* first copy existing recs */ 
for(i = 0; i < p_size; i++) { 
strcpy(allRecsTemp[i].name, p_allRecs[i]->name);/* this want't work */ 
allRecsTemp[i].nr = p_allRecs[i]->nr;/* this want't work */ 
} 
/* then ask for new record */ 
printf("Name?"); 
    scanf("%s", &allRecssTemp[p_size].name); 
    printf("Nr? "); 
    scanf("%d", &allRecsTemp[p_size].nr); 
    p_size++; 
    free(p_allRecs); 
    p_allRecs = allRecsTemp; 
+0

這個樣子的realloc的笨拙的重寫。 – 2010-01-02 14:12:39

+0

它笨拙,但重寫realloc並不是壞事,恕我直言。 – 2010-01-02 14:19:11

回答

2

在C中,可以指定結構。你可以這樣說:

allRecsTemp[i] = (*p_allRecs)[i]; 

不需要調用strcpy()等。這樣做應該簡化你的代碼。哦,還有:

free(p_allRecs); 
p_allRecs = allRecsTemp; 

應該是:

free(* p_allRecs); 
* p_allRecs = allRecsTemp; 

記住 - p_allRecs爲s指針的指針,而allRecsTemp只是一個指針。

+0

好的,非常感謝! – 2010-01-02 16:38:52

0

記住p_allRecs是一個指針的指針記錄數組的開始:

void AddRecord(struct myRecord **p_allRecs, int p_size){ 
    int i; 
    struct record *allRecsTemp; 
    allRecsTemp = (struct record *)malloc((p_size+1)*sizeof(struct record)); 

    memcpy(allRecsTemp, *p_allRecs, p_size*sizeof(struct_record)); // only if records do not contain pointers to one another! 

    free(*p_allRecs); 
    *p_allRecs = allRecsTemp; 

    (*p_allRecs)[p_size].name = "new record name"; 
    (*p_allRecs)[p_size].nr = 3; // or whatever 

}