【问题标题】:Memory allocation and core dump for pointers to structures in cc 中指向结构的指针的内存分配和核心转储
【发布时间】:2013-05-06 07:43:14
【问题描述】:

对不起,我是内存分配和结构的新手(所以很可能这是我错过的一些愚蠢的事情)。我有以下代码,它是 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;

 }

谢谢:)

【问题讨论】:

  • 您的代码无法编译 - 例如,malloc() 不接受两个参数。还有其他几个编译器错误。但是在修复它们之后,我可以看到有什么问题......
  • 是的,对不起,这只是我原始代码的一个非常快速的简化副本,也在尝试 calloc

标签: c memory-management struct malloc


【解决方案1】:
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 返回值)。

【讨论】:

  • 谢谢 :) 似乎通过了这一行并且 def 具有正确的值,但是当尝试添加名称时,它现在是第二行的核心转储。我打印了分配的内存,它是 4,对我来说听起来不对:/ 有什么建议吗?我应该根据每个变量的大小重新分配内存吗?再次感谢
  • 好吧,我找不到您为 name 分配内存的任何地方 - 可能是您已从您发布的示例中删除了它,或者这就是它不起作用的原因写给它...
  • 不 malloc(或在这种情况下为 calloc)为整个结构分配内存:$ 对不起,这是新的
  • name 是一个指针。 malloc 只为结构分配内存,而不是结构内的任何指针。您当然可以使用 char name[SOMETHING] 其中 SOMETHING 是合适的大小,例如16 或 20,而不是只为名称分配第二个内存块 - 这将占用超过 16 个字节。
  • 嗨,非常感谢,好吧,有些东西并不是真正的固定长度,它取决于从文件中解析的值。感谢您的解释:) 在这方面做得更好:)
猜你喜欢
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 2018-05-16
相关资源
最近更新 更多