C将结构体/指针数组声明为结构体数组

时间:2019-10-25 16:41:44

标签: c

我有一个示例教程,其中包含2个文件“ functions.c”和“ functions.h”,其中包含函数的原型和主体。
在该示例中,没有主要内容包含声明struct / pointer的数组到结构的数组以及对函数的调用。

functions.c:

@Configuration

functions.h:

#include "functions.h"

const char *getTeamA(const sTest *p)
{
    return p->teamA;
}

void setTeamA(sTest *p, char *s)
{
    strcpy(p->teamA, s);
}

int getNum(const sTest *p)
{
    return p->num;
}

void setNum(sTest *p, int i)
{
    p->num = i;
}

所以我的问题是
我如何根据上面编写的代码声明该结构? 例如:

#ifndef FUNCTIONS_H_
#define FUNCTIONS_H_

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

#define MAX_CHAR 20
#define SIZE 5

typedef struct {
    char teamA[MAX_CHAR];
    int num;
    // ...
} sTest;


const char *getTeamA(const sTest *p);
void setTeamA(sTest *p, char *s);

int getNum(const sTest *p);
void setNum(sTest *p, int i);

#endif /* FUNCTIONS_H_ */

这是正确的方法吗?还是有更好的方法来声明变量并将其传递给函数?
重要的是我必须坚持在functions.c和functions.h中编写的代码,因此函数无法直接修改结构数据,需要使用指针(因为函数中有成员选择运算符“->” .c)。

2 个答案:

答案 0 :(得分:2)

您不需要void read_file(char *contents[], int lines, char *filename){ int j = 0; size_t len = 0; FILE *file = fopen(filename, "r"); for(j = 0; j < lines; j++){ contents[j] = NULL; len = 0; getline(&contents[j], &len, file); } fclose(file); } 。您可以通过执行dataPtr来执行完全相同的操作,因为您将数据声明为data[i]的数组,因此sTest指向数组中的第一个元素。

让我们在调用data时解构您正在做的事情。您试图将数据数组中的第一个sTest结构设置为具有“ name1”作为teamA字段。请注意,setTeamA(dataPtr[0].teamA, "name1")的原型实际上包含了setTeamA()。在您的示例中,您正在传递sTest *p字段。因此,您真正想调用的是teamA。这将转换为指向dataPtr [0]处数据的指针。

正如我之前说过的,尽管这行得通,但dataPtr是不必要的。因此,这等效于: setTeamA(&dataPtr[0], "name1")

同样值得注意的是,您可以简单地写: setTeamA(&data[0], "name1") 因为数据已经是指向数组中第一个元素的指针。

答案 1 :(得分:0)

使用     setTeamA(&data [0],“ name1”)

它索引到索引0,然后获取结果的引用(是一个指针),因此将类型设为sTest *,然后setTeamA函数将完成对teamA字段的设置。

那个dataPtr变量在这里没用。