【问题标题】:How to add records (struct) in a function in the C programming language?如何在 C 编程语言的函数中添加记录(结构)?
【发布时间】:2010-12-31 18:58:30
【问题描述】:

如果作为参数发送给函数,如何添加记录?

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;

【问题讨论】:

  • 这看起来像是对 realloc 的笨拙重写。
  • 这很笨拙,但是重写 realloc 也不是坏事,恕我直言。

标签: c parameters function struct


【解决方案1】:

在 C 中,可以分配结构。因此,您可以这样说:

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

无需调用 strcpy() 等。这样做可以简化您的代码。哦,还有:

free(p_allRecs);
p_allRecs = allRecsTemp;

应该是:

free( * p_allRecs );
* p_allRecs = allRecsTemp;

记住 - p_allRecs 是一个指向指针的指针,而 allRecsTemp 只是一个指针。

【讨论】:

    【解决方案2】:

    记住 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
    
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-14
      • 2020-11-01
      • 2016-08-06
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 2014-11-20
      相关资源
      最近更新 更多