【问题标题】:Check pointer in struct is NULL检查结构中的指针是否为 NULL
【发布时间】:2016-05-06 09:56:08
【问题描述】:

我在检查结构中的指针是否为空时遇到了一些问题,这是我的代码:

zone* z = malloc(sizeof(zone));
z->cases = malloc(sizeof(Case)*300);

for(i = 0; i < 300; i++)
{
    Case* c = z->cases[i];

    if(c->fourmilier) // HERE IS RAISE SEGMENTATION FAULT
    {
        if(read( &nbTypeFourmib, sizeof( unsigned char))==-1) {
            exit(EXIT_FAILURE);
        }
    }
}

我的结构:

typedef struct {
    unsigned short foodSpawnfreq;
    unsigned short foodUnit;
    unsigned char sourceFood;
    Case** cases;
    TypeFourmi** TypeFourmi;
    TypeFourmi** TypeBibibte;
} zone;

typedef struct{
    fourmiliere* fourmilier;
    bibite* bibit;
    fourmis* fourmi;
    char obstacle;
} Case;

【问题讨论】:

    标签: c pointers segmentation-fault


    【解决方案1】:

    您的结构体将case 的类型指定为Case**。但是,您正在为其分配 Case*。

    你需要做的是改变:

    z->cases = malloc(sizeof(Case)*300);
    

    到...

    z->cases = malloc(sizeof(Case*)*300);
    

    在你的循环中......

    z->cases[i] = malloc(sizeof(Case));
    
    // initialise data
    
    Case* c = z->cases[i];
    

    【讨论】:

    • 把Case**改成Case*,改用Case* c = &amp;z-&gt;cases[i];会简单很多。
    • @user694733 是的,但很难说这段代码的最终目标是什么,所以我只选择了直接路线
    【解决方案2】:

    试试这个

    if((NULL != c) && c->fourmilier)
    

    我认为您实际上需要类似的东西

    z->cases = new Case[300];
    

    而不是

    z->cases = malloc(sizeof(Case)*300);
    

    【讨论】:

    • 原始问题看起来像 C(因此我将其标记为这样),如果是这种情况,则没有 new 关键字:)
    • 我没注意标签:(
    猜你喜欢
    • 2015-02-07
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多