C动态数组初始化问题

时间:2010-11-16 18:53:25

标签: c

我在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++;

}

5 个答案:

答案 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() {
}

您的代码中的其他位置必定存在错误。我有没有提到这个设计有多么可怕?你应该真的使用对象。