繁体   English   中英

在单独的头文件中定义的结构

[英]A struct defined in a separate header file

LMlib.h

#ifndef LMlib_H
#define LMlib_H
#endif

#define MAX_IP_LENGTH 15         
#define MAX_TABLE_ROWS 255

struct ForwardingTableRow
{
        char address[MAX_IP_LENGTH];
        int subnetMask;
        int interface;
};

typedef struct ForwardingTableRow ForwardingTableRow;

LMlib.c

#include <stdio.h>
#include <math.h>
#include "LMlib.h"

void ReadForwardingTable(FILE* f,ForwardingTableRow * table)
{
        int i;
        for(i=0;i<MAX_TABLE_ROWS;i++)
        {
                fscanf(f,"%s %d %d",&table.address[i],&table.subnetMask[i],&table.interface[i]);
        }


}

编译器命令:

cc LMlib.c LMlib.h main.c -lm

错误:

LMlib.c: In function ‘ReadForwardingTable’:
LMlib.c:11:27: error: request for member ‘address’ in something not a structure or union
LMlib.c:11:45: error: request for member ‘subnetMask’ in something not a structure or union
LMlib.c:11:66: error: request for member ‘interface’ in something not a structure or union

我做错了什么?

您遇到三个问题:第一个问题是您没有正确使用数组索引。 table变量是数组,而不是结构成员:

fscanf(f, "%s %d %d",
    table[i].address,
    &table[i].subnetMask,
    &table[i].interface);

第二个问题与您的问题无关,但将来可能会引起麻烦。 这是您所拥有的包括后卫。 #endif应该在文件的末尾 ,否则,您只能保护单个#define而不能保护其他任何内容。

第三个也是最严重的问题是, address字段中的字符很少。 IP地址的最大长度为15,这是正确的,但是如果要将其视为字符串,则还需要用于字符串终止符的空间。 声明为

address[MAX_IP_LENGTH + 1];

而且应该没关系。

这完全与运算符优先级有关 . 具有比&更高的优先级,因此基本上它说:

  &(table.address)[i]

table不是结构,而是指向结构的指针。 然后,您在索引编制中是错误的,您正在索引结构的成员,而不是数组。

像这样重写:

  table[i].address

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM