我正在尝试编写一个函数,用于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_t
;sizeof
会给你指针对象的大小,而不是你分配的元素数量。您想要做的是如下所示:
/**
* 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] 删除。
我来说两句