无法在c中解析struct成员

时间:2014-03-04 22:26:11

标签: c data-structures

我在c中有一个头文件,我在其中声明:

struct Symbles{
    char symbolName[MAX_LENGTH_SYMBOL];
    int value;
    struct inSymbles *symbolAddress;
    int binaryValue;
    int isData; /*1 is true 0 is false*/
    int isString; /*1 is true 0 is false*/
};

使用此声明我使用源文件:

void start(char *line){
char *ptr=malloc(sizeof(char)*MAX_CHARS);
char *toCheck=malloc(sizeof(char)*MAX_CHARS);
char *temp=malloc(sizeof(char)*MAX_CHARS);
struct Symbles symbles_arr[MAX_LENGTH_SYMBOL];
/*copy the original string to work with a pointer*/
strcpy(ptr,line);
toCheck=strtok(ptr,":");
/*temp will help to check if there is a string or a data sentence*/
strcpy(temp,ptr);
while(toCheck!=NULL)
{
    if(isSymbol(toCheck)) {
        if(!(isEntryExtern(temp,ptr))){
            /*add to symbol list*/
            symbolFlag=TRUE;
            /*symbolTable[symbol_counter]=malloc(sizeof(struct Symbles));*/
            symbles_arr[symbol_counter]=malloc(sizeof(struct Symbles));
            strcpy(symbles_arr[symbol_counter].symbolName,*toCheck);
            /**Symbles.symbolTable[symbol_counter].*symbolName=*toCheck;*/
            }
        else{
            printf("error, symbol and entry or extern");

            return;
            }
        }
}

}

这段代码的目的是找出一个符号是否存在于一个汇编文件中,但它并不重要,只是这个结构的东西让我感到恼火。 我已将头文件包含在源文件的顶部,因此不会成为错误来源。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

请注意

typedef struct Symbles symbles_arr[MAX_SYMBOLS_ENTRIES_EXTERNALS];

不声明变量;相反,它会创建typedef,其中symbles_arr指的是struct Symbles[MAX_SYMBOLS_ENTRIES_EXTERNALS]。因此,写作

symbles_arr[symbol_counter]->symbolName=*toCheck;

就像写作

(struct Symbles[MAX_SYMBOLS_ENTRIES_EXTERNALS])[symbol_counter]->symbolName = *toCheck;

这没有意义,因为您正在尝试访问类型的特定数组索引,这是不允许的。

要解决此问题,请删除typedef,使symbles_arr成为实际数组,或者创建Symbles类型的对象。

希望这有帮助!

答案 1 :(得分:1)

有两个(或更多)问题。第一个:当你试图声明一个结构数组时,你正在使用typedef。别。而不是

typedef struct Symbles symbles_arr[MAX_SYMBOLS_ENTRIES_EXTERNALS];

使用

struct Symbles symbles_arr[MAX_SYMBOLS_ENTRIES_EXTERNALS];

请注意,您现在拥有结构(不是指向结构的指针) - 所以当您想要访问元素时,您需要.而不是->因此:

 symbles_arr[symbol_counter]->symbolName=*toCheck;

需要成为

 strcpy(symbles_arr[symbol_counter].symbolName, *toCheck);

因为你在结构中为符号名称分配了空间,你不能只拿这个指针并把它指向其他地方。

最后 - malloc您不需要toCheck空格,因为strtok实际上会返回指向原始字符串的指针(它不会复制)。这样做的副作用是您的输入字符串(传递给strtok的字符串)在此过程中变得严重 - 在您使用它之后,它会添加很多'\0'

可能还有其他问题,但这应该可以帮助你......