我在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;
}
}
}
}
这段代码的目的是找出一个符号是否存在于一个汇编文件中,但它并不重要,只是这个结构的东西让我感到恼火。 我已将头文件包含在源文件的顶部,因此不会成为错误来源。
感谢您的帮助。
答案 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'
。
可能还有其他问题,但这应该可以帮助你......