【问题标题】:return a pointer to a pointer array返回指向指针数组的指针
【发布时间】:2010-07-03 21:02:21
【问题描述】:

我在释放指针数组(值)中的指针时遇到问题。

typedef struct MyStruct{  char** values;  }MyStruct;

在 C 中,我创建了动态数组。

JSDictionary **array = (JSDictionary **)malloc(sizeof(JSDictionary *) * numRows);

resultSet 应该是一个 JSDictionary 指针数组。我创建这样的结构:

JSDictionary * newJSDictionaryWithSize(unsigned int size)

{
JSDictionary *new = malloc(sizeof(JSDictionary));
    printf("new %p\n", self);
new->_size = size;
new->count = 0;

new->values = (char **) malloc(sizeof(char *) * size);
for(unsigned int i = 0; i < size; i++){
    new->values[i] = (char *)malloc(sizeof(char *));
}

return new;
}

一切都创建和工作正常。是免费给了我一个问题。

void deallocJSDictionary(struct JSDictionary *self)

{
printf("dealloc %p\n", self);
for(unsigned int i = 0; i < self->_size; i++){
    printf("free %p\n", &self->values[i]);
    free(self->values[i]);
}
free(self->values);
free(self);

}

我得到一个指针被释放没有分配错误。传入的指针显示的内存地址与我创建并添加到数组中的内存地址相同。值指针(在调试器中)在 dealloc 函数中显示与我创建它时相同的内存地址。问题是试图释放值数组中的第一个点。任何想法为什么值指针数组中的第一个点不同?

【问题讨论】:

    标签: c pointers arrays


    【解决方案1】:

    到目前为止,我发现了两个问题。第一:

    new->values[i] = (char *)malloc(sizeof(char *));
    

    这一行分配了一个单个指针——可能不是你想要的。应该是这样的:

    new->values[i] = malloc( MAX_SIZE_OF_VALUE );
    

    即保存值的缓冲区。您还可以分配一个大卡盘来保留所有值并仅偏移到该内存中。

    第二:

    printf("free %p\n", &self->values[i]);
    free(self->values[i]);
    

    这将打印并尝试free(3) 两个不同的指针。第一个是第二个的地址。

    至于实际的释放错误——你在管理字典的代码中有这样的赋值吗?

    dict->values[i] = some_value;
    

    如果是这样 - 您正在使用指向可能堆栈或静态内存的指针覆盖指向(和泄漏)已分配内存的指针。您必须将值 复制 到“值缓冲区”中。比如:

    strlcpy( dict->values[i], some_value, MAX_SIZE_OF_VALUE );
    

    希望这会有所帮助。

    【讨论】:

    • 关于 dealloc 错误的要点。我用一个新的指针覆盖了指针,我忘记了。
    【解决方案2】:

    问题可能出在您的内存分配代码中。下面一行

    new->values = (char **) malloc(sizeof(char *) * size);
    

    分配char 指针数组,其中包含size 元素。因此,这是不必要的:

    for(unsigned int i = 0; i < size; i++){
        new->values[i] = (char *)malloc(sizeof(char *));
    }
    

    您在这里所做的是将char ** 转换为char *new-&gt;values 数组的每个元素中。也就是说,您分配了足够的内存来存储char * 值,然后将指向该内存的指针存储在new-&gt;values 数组中。我猜你这样做是错误的,因为

    new->values = (char **) malloc(sizeof(char *) * size);
    

    已经为new-&gt;values 数组的每个元素分配了足够的内存。

    我猜你想要的是:

    for(unsigned int i = 0; i < size; i++){
        new->values[i] = (char *)malloc(sizeof(char) * MAX_STRING_LENTH);
    }
    

    new-&gt;values 数组的每个元素创建一个包含MAX_STRING_LENGTH 元素的char 缓冲区。这允许您在每个元素中存储一个字符串,并且您的 freeing 代码应该可以正常工作。

    或者,如果new-&gt;values 的元素设置在其他位置,那么您可能不希望在您的解构器中成为freeing 它们,除非它们是动态分配的并且您知道不存在对它们的其他引用那一点。

    【讨论】:

      【解决方案3】:

      您的函数本质上没有任何问题。尽管出现了一些语法错误,但它们编译得很好,并且它们产生了预期的输出。因此,正如其他人指出的那样,您可能正在分配已分配的指针、未分配的数据(即堆栈数据),或者您正在传递 JSDictionary 结构,这些结构首先通过 @ 未正确分配987654322@.

      作为一项快速测试,仅对一个 JSDictionary 执行 alloc/dealloc 以验证您的功能是否正常工作。

      JSDictionary *ptr = newJSDictionaryWithSize(10);
      deallocJSDictionary(ptr);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-30
        • 2013-04-10
        • 1970-01-01
        • 2021-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-12
        相关资源
        最近更新 更多