结构内数组的重新分配

科斯塔斯7

我正在尝试编写一个函数,用于realloc()扩展结构实例中指向的数组,但是我似乎无法让它工作。

我的代码的相关部分是:

struct data_t {
  int data_size;
  uint16_t *data;
};

void extend_data(data_t container, uint16_t value) {
    // adds an additional uint16_t to the array of DATA, updates its internal
    // variables, and initialises the new uint to VALUE.

    int len_data = sizeof(*(container->data)) / sizeof(uint16_t);
    printf("LENGTH OF DATA: %d\n", len_data);

    container->data = realloc(container->data, sizeof(*(container->data))+sizeof(uint16_t));
    container->data_size++;
    container->data[container->data_size-1] = value;

    len_data = sizeof(*(container->data)) / sizeof(uint16_t);
    printf("LENGTH OF DATA: %d\n", len_data);
    printf("data_size: %d\n", container->data_size);

    return;
}

有人能看出这是什么问题吗?

约翰·博德

编辑

正如 R. Sahu 指出的,container不是这个函数中的指针——当你说代码“不起作用”时,我假设你的意思是你没有增加你的数组,但你在这里写的不会甚至编译

您确定您已正确复制此代码吗?如果是这样,“不工作”是否意味着您收到编译时错误、运行时错误或只是意外输出?

如果您已经按照所写的方式复制了代码,那么您需要做的第一件事就是将函数原型更改为

void extend_data(data_t *container, uint16_t value) {

并确保您传递了一个指向您的data_t类型指针,否则更新将不会反映在调用代码中。

原来的

在行中

container->data = realloc(container->data, sizeof(*(container->data))+sizeof(uint16_t));

sizeof(*(container->data))评估为sizeof (uint16_t). container->data指向,而不是数组的指针uint16_tsizeof会给你指针对象的大小,而不是你分配的元素数量。您想要做的是如下所示:

/**
 * Don't assign the result of a realloc call back to the original
 * pointer - if the call fails, realloc will return NULL and you'll
 * lose the reference to your original buffer.  Assign the result to
 * a temporary, then after making sure the temporary is not NULL,
 * assign that back to your original pointer.
 */
uint16_t *tmp = realloc(container-data, sizeof *container->data * (container->data_size + 1) );
if ( tmp ) 
{
  /**
   * Only add to container->data and update the value of container->data_size
   * if the realloc call succeeded.
   */
  container->data = tmp;
  container->data[container->data_size++] = value;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章