0

申し訳ありませんが、私はメモリ割り当てと構造に不慣れです(おそらく、私が見逃したばかげたことです)。Solaris でのコア ダンプである次のコードがあります。後で要素を追加する方法もわかりません(メモリを再割り当てする必要がありますか?)

 enum field_type
 {
        FLD_STRING, 
        FLD_SHORT
 };


 typedef struct {
    long        id;
    char        *name;
    field_type  type;
    void        *value;
 } myStruct_t ;

 typedef struct {
    long id;
    const char *name;
    field_type type;
    const char *descr;
 } myStructDef_t;

 myStructDef_t Alldef[] = 
 {
    {0, "FirstField", FLD_STRING, "First Field Of Structure"},
    {1, "SecondField", FLD_STRING, "Second Field Of Structure"},
    {-1}
 };


 int main()
 {
    myStruct_t *p_struct;
    char tmp[100] = {'\0'};
    long id = 0;

    if(NULL == (p_struct= structAlloc(1024)))
    {
        print("Failed allocating memory\n");
        return 0;
    }
    sprintf(tmp, "Test Adding value");
    addValueToStruct(p_struct, id, (void *)tmp);

 }

 myStruct_t *structAlloc(long size)
 {
    myStruct_t *tmp = (myStruct_t *) calloc(size, sizeof *tmp);
    if(NULL != tmp)
        tmp->id = -1;
    return tmp;
 }

 int addValueToStruct(myStruct_t *p_struct, long id, (void *)value)
 {
    myStruct_t *bkStruct = p_struct;
    myStructDef_t *def = NULL;

    if(-1 == getIdDefinition(def, id))
    {
        printf("Failed to find definition for id [%ld]", id);
        return -1;
    }

    // Core dumping on 1st line below
    bkStruct->id = def->id;
    sprintf(bkStruct->name, "%s", def->name);
    bkStruct->type = def->def->type;
    if(FLD_SHORT == bkStruct->type)
        memcpy(bkStruct->value, value, sizeof(*(short *)value));
    else if(FLD_STRING == bkStruct->type)
        memcpy(bkStruct->value, value, sizeof(*(char *)value));

    return 0;
 }

 int getIdDefinition(myStructDef_t *def, long id)
 {
    myStructDef_t *AllDefsTmp = Alldef;
    bool found = false;

    while( -1 != AllDefsTmp->id)
    {
        if(id == AllDefsTmp->id)
        {
            def = AllDefsTmp;
            found = true;
            break;
        }
        AllDefsTmp ++;
    }

    if(!found)
        return -1;

    return 0;

 }

ありがとう :)

4

1 に答える 1

0
myStructDef_t *def = NULL;

if(-1 == getIdDefinition(def, id))
{
    printf("Failed to find definition for id [%ld]", id);
    return -1;
}

// Core dumping on 1st line below
bkStruct->id = def->id;

呼び出しGetIdDefinition(def, id)defその関数内に入力されますが、関数内の値は変更されません。それ自体addValueToStructの値を変更できるように、二重ポインター (C の場合) または参照 (C++ の場合) が必要です。(または、もちろん、または戻り値defの代わりに、見つけた値を返すこともできます)。-10

于 2013-05-11T22:39:40.467 に答える