【问题标题】:Accessing an Array of Structures through a pointer通过指针访问结构数组
【发布时间】:2011-05-23 13:29:15
【问题描述】:

这里我有一个结构定义:

typedef struct person {
unsigned int ssn, age, height, weight, income;
char name[MAXS+1], job[MAXS+1], religion[MAXS+1], major[MAXS+1], minor[MAXS+1], gender;
}PERSON;

这里我有一个 PERSON 定义类型的函数内结构数组:

    PERSON record[MAXR+1];

如何将此数组传递给另一个函数以进行实时更新(即作为指针)?

我的直觉和先验知识告诉我要做到以下几点:

PERSON *rp[MAXR+1];
for(i=0; i<MAXR; i++){
        *rp[i]=&record[i];
    }
valid=readfile(fp, rp);

但是,我收到“分配中的类型不兼容”错误。 这样做的正确方法是什么?

这里是完整的代码:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAXS 19
#define MAXR 999

typedef struct person {
unsigned int ssn, age, height, weight, income;
char name[MAXS+1], job[MAXS+1], religion[MAXS+1], major[MAXS+1], minor[MAXS+1], gender;
}PERSON;


//get and check ssn
int getssn(){
int num;

printf("\nSSN: ");
scanf("%d", &num);

if(num<=99999999 || num>999999999){
    printf("\nPlease input a valid SSN.\n");
    return 0;
}
else
    return num;
}

int readfile(FILE *fptr, PERSON **rptr){
int v=0, i, j;

for(i=0; i<MAXR; i++){
    j=i;
    if(fscanf(fptr, "%c\n%d\n%19s\n%d\n%19s\n%d\n%19s\n%19s\n%d\n%d\n%19s\n\n",
          &rptr[j]->gender, &rptr[j]->ssn, rptr[j]->name, &rptr[j]->age, 
          rptr[j]->job, &rptr[j]->income, rptr[j]->major, rptr[j]->minor,
          &rptr[j]->height, &rptr[j]->weight, rptr[j]->religion)==EOF)
        i=MAXR;
    if(&rptr[MAXR]->ssn==&rptr[j]->ssn)
        v=j;
}


return v;
}

int main(){
int valid=0, i;
char filename[MAXS]="clients.txt";
FILE *fp;
PERSON record[MAXR+1], *rp[MAXR+1];

do{
    record[MAXR].ssn=getssn();
}while(record[MAXR].ssn==0);

printf("Name of file of records: ");
//gets(filename);

if((fp=fopen(filename, "r"))==NULL)
    printf("\nCould not open file\n");
else{
    printf("\njur doing gohd\n");
    for(i=0; i<MAXR; i++){
        *rp[i]=&record[i];
    }
    valid=readfile(fp, rp);
    if(valid==0){
        printf("\nSSN %d is not found in file %s.\n", record[MAXR].ssn, filename);
    }
    else {
        printf("%d", valid);
    }
}



return 0;
}

【问题讨论】:

    标签: c arrays function pointers struct


    【解决方案1】:

    您正在尝试将 PERSON 变量的地址分配给实际的 PERSON 变量(不是地址),您可能打算这样做:

    rp[i]=&record[i];
    

    请注意,它会将指针复制到结构,而不是结构本身。如果要复制结构,需要使用memcpymemmove

    【讨论】:

      【解决方案2】:

      你只需要:

      int readfile(FILE *fptr, PERSON *rptr);
      

      数组 - 定义明智 - 只是指向您定义的结构的一级指针。

      int readfile(FILE *fptr, PERSON *rptr){
      int v=0, i, j;
      
      for(i=0; i<MAXR; i++){
          j=i;
          if(fscanf(fptr, "%c\n%d\n%19s\n%d\n%19s\n%d\n%19s\n%19s\n%d\n%d\n%19s\n\n",
                rptr[j]->gender, rptr[j]->ssn, rptr[j]->name, rptr[j]->age, 
                rptr[j]->job, rptr[j]->income, rptr[j]->major, rptr[j]->minor,
                rptr[j]->height, rptr[j]->weight, rptr[j]->religion)==EOF)
              i=MAXR;
          if(rptr[MAXR]->ssn==rptr[j]->ssn)
              v=j;
      }
      

      不需要指针到指针,因为您在函数之外声明数组。如果您使用malloc 在函数内部分配内存,那么您需要一个指向指针的指针来返回分配内存的指针 - 但不是您的情况。

      【讨论】:

        【解决方案3】:

        还值得指出 fptr[i]->job 中隐含的括号。 它是 (*fptr)[i],而不是 *fptr[i] 或 *(fptr[i])。也就是说,您要索引 在你跟随指针之后,而不是之前。

        【讨论】:

          【解决方案4】:

          数组不能直接传递给函数——如果你尝试,它只是传递一个指向数组第一个元素的指针(可以像数组本身一样被索引来访问数组的任何成员)。这就是为什么您可能会听到数组是“通过引用传递”的原因 - 虽然 技术上 不正确,但这就是效果。

          所以,你需要做的就是像这样声明你的函数:

          int readfile(FILE *fptr, PERSON rptr[])
          {
              int v = 0, i;
          
              for(i = 0; i < MAXR; i++) {
                  if (fscanf(fptr, "%c\n%d\n%19s\n%d\n%19s\n%d\n%19s\n%19s\n%d\n%d\n%19s\n\n",
                    &rptr[i]->gender, &rptr[i]->ssn, rptr[i]->name, &rptr[i]->age, 
                    rptr[i]->job, &rptr[i]->income, rptr[i]->major, rptr[i]->minor,
                    &rptr[i]->height, &rptr[i]->weight, rptr[i]->religion) < 11)
                      break;
          
                  if (rptr[MAXR]->ssn == rptr[i]->ssn)
                      v = i + 1;
              }
          
              return v;
          }
          

          ...你可以直接这样调用它:

          valid = readfile(fp, record);
          

          根本不需要rp

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-12-11
            • 1970-01-01
            • 2011-02-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多