我在C程序中初始化一个结构数组时遇到问题。这是初始化的函数:
void InitializeBPStructures() {
SatCounterTable = (struct SatCounterTableEntry *)malloc(sizeof(struct SatCounterTableEntry) * Counter_Count);
}
Counter_Count
是一个整数全局变量,SatCounterTable
在C源文件中先前声明为
static struct SatCounterTableEntry* SatCounterTable;
如果相关,那就是我的SatCounterTable struct
struct SatCounterTableEntry {
enum SatCounter_State Predict_State;
md_addr_t tag;
};
md_addr_t
只是与内存地址
unsigned int
的标签
问题是当我尝试编译时,我收到以下错误
sim-safe.c:129: error: expected expression before ‘=’ token
我的IntitializeBPStructures()
中的数组初始化在第129行。我不确定为什么这行是一个问题。有什么想法吗?
编辑:
这是函数
的一些额外代码行 struct SatCounterTableEntry
{
enum SatCounter_State Predict_State;
md_addr_t tag;
};
/* simulated registers */
static struct regs_t regs;
/* simulated memory */
static struct mem_t *mem = NULL;
/* track number of refs */
static counter_t sim_num_refs = 0;
/* maximum number of inst's to execute */
static unsigned int max_insts;
static struct SatCounterTableEntry* SatCounterTable;
void InitializeBPStructures()
{
SatCounterTable = (struct SatCounterTableEntry *)malloc(sizeof(struct SatCounterTableEntry) * Counter_Count);
}
void BranchPredict(md_addr_t PC, md_addr_t nextPC, enum Branch_Result result)
{
if (result == N)
sim_num_mispred_static++;
if (result != (myrand() % 2))
sim_num_mispred_random++;
sim_num_br++;
}
答案 0 :(得分:2)
你在126行丢失了一个分号。
编辑:新想法
你是否有一个额外的=
#define?
#define Counter_Count = 42; /* WRONG */
#define Counter_Count = 42 /* WRONG */
#define Counter_Count 42; /* WRONG, but it works some time */
#define Counter_Count 42 /* CORRECT */
答案 1 :(得分:1)
SatCounterTable
早先在C源文件中声明为static struct SatCounterTableEntry* SatCounterTable;
该声明是在文件范围内制作还是在另一个函数中?如果是后者,则SatCounterTable
内的InitializeBPStructures()
名称将不可见。
答案 2 :(得分:1)
SatCounterTable = (struct SatCounterTableEntry *)malloc(sizeof(struct SatCounterTableEntry) * Counter_Count);
唉。帮我一个忙,然后改写为
SatCounterTable = malloc(sizeof *SatCounterTable * Counter_Count);
你真的不需要施放malloc()
的结果;自C89采用以来一直没有必要。在被分配的对象而不是类型上使用sizeof
可以节省一些胃灼热(如果没有别的话,它可以节省一些击键)。
错误文本表明在此次调用之前尚未正确定义某些;由于某种原因,它无法识别SatCounterTable
。我认为pmg是在正确的轨道上。在此调用之前,您必须缺少分号或大括号或其他内容。
答案 3 :(得分:0)
您使用的C编译器有理由相信SatCounterTable不是左值或主表达式。鉴于您的变量是如何命名的(我可能会混淆地添加),您是否有可能在更近的范围内使用名称SatCounterTable定义变量,这样SatCounterTable不是可赋值的表达式?
编辑:我也会认真考虑pmg的答案。
答案 4 :(得分:0)
我编译了这段代码:
#include <stdlib.h>
typedef unsigned int md_addr_t;
typedef unsigned int counter_t;
int myrand() { return 0; }
struct SatCounterTableEntry
{
enum SatCounter_State Predict_State;
md_addr_t tag;
};
static unsigned int Counter_Count;
static unsigned int sim_num_mispred_static;
static unsigned int sim_num_mispred_random;
static unsigned int sim_num_br;
static const unsigned int N = 0;
/* simulated registers */
static struct regs_t {} regs;
/* simulated memory */
static struct mem_t *mem = NULL;
/* track number of refs */
static counter_t sim_num_refs = 0;
/* maximum number of inst's to execute */
static unsigned int max_insts;
static struct SatCounterTableEntry* SatCounterTable;
void InitializeBPStructures()
{
SatCounterTable = (struct SatCounterTableEntry *)malloc(sizeof(struct SatCounterTableEntry) * Counter_Count);
}
void BranchPredict(md_addr_t PC, md_addr_t nextPC, enum Branch_Result result)
{
if (result == N)
sim_num_mispred_static++;
if (result != (myrand() % 2))
sim_num_mispred_random++;
sim_num_br++;
}
int main() {
}
您的代码中的其他位置必定存在错误。我有没有提到这个设计有多么可怕?你应该真的使用对象。