C编程:另一个函数中的动态malloc
所以我尝试在其他函数中动态地malloc内存。这是我的简化代码,我无法正确理解 第一个malloc初始化内存 第二个malloc(realloc)扩展它,我的原始代码在循环中使用它,所以内存可以继续扩展 我得到了以下结果:C编程:另一个函数中的动态malloc,c,C,所以我尝试在其他函数中动态地malloc内存。这是我的简化代码,我无法正确理解 第一个malloc初始化内存 第二个malloc(realloc)扩展它,我的原始代码在循环中使用它,所以内存可以继续扩展 我得到了以下结果: size=2 data=0.000000 data=2.500000 但我期待着 size=2 data=1.500000 data=2.500000 有什么建议吗?这是我的密码 #include <stdio.h> #include <stdlib.
size=2
data=0.000000
data=2.500000
但我期待着
size=2
data=1.500000
data=2.500000
有什么建议吗?这是我的密码
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
time_t time_stamp;
double data;
} sensor_data;
void Get_Data(sensor_data **raw_data,int *size){
(*size) = 0;
*raw_data = (sensor_data *)malloc(sizeof(sensor_data) * ((*size) + 1));
(*raw_data)[(*size)].data = 1.5;
(*size)++;
*raw_data = (sensor_data *)malloc(sizeof(sensor_data) * ((*size) + 1));
(*raw_data)[(*size)].data = 2.5;
(*size)++;
}
int main() {
sensor_data *raw_data;
int size = 0;
Get_Data(&raw_data,&size);
printf("size=%d\n",size);
int i = 0;
for( i = 0; i < size; i++)
{
printf("data=%f\n",raw_data[i].data);
}
free(raw_data);
return 0;
}
#包括
#包括
类型定义结构
{
时间戳;
双重数据;
}传感器数据;
无效获取数据(传感器数据**原始数据,整数*大小){
(*大小)=0;
*原始数据=(传感器数据*)malloc(传感器数据大小)*((*大小)+1);
(*原始数据)[(*大小)]。数据=1.5;
(*大小)+;
*原始数据=(传感器数据*)malloc(传感器数据大小)*((*大小)+1);
(*原始数据)[(*大小)]。数据=2.5;
(*大小)+;
}
int main(){
传感器数据*原始数据;
int size=0;
获取数据(原始数据和大小);
printf(“大小=%d\n”,大小);
int i=0;
对于(i=0;i
在GetData
函数中,首先为1sendor\u data
数组分配空间,然后写入,这很好。但是您随后为一个新数组分配了空间,这次为2个元素分配了空间,并覆盖指向原始分配内存的指针。因此,松开原始内存块,只写入新块的第二个元素
在第二种情况下,您需要的不是malloc
,而是realloc
。此功能允许您调整已分配内存块的大小,并将旧块中的任何数据保留在新块中。如果新块较大,则会取消初始化其他字节。如果新块较小,则旧块中的数据将被截断为新块的大小
因此,将您的第二个malloc
调用更改为realloc
:
*raw_data = realloc(*raw_data, sizeof(sensor_data) * ((*size) + 1));
另外,您应该测试
malloc
和realloc
的结果,看看它们是否返回了NULL
,以及。除了明显的内存泄漏之外,它以什么方式不起作用?挑剔:要么是malloc,要么是动态分配。挑一个,几个问题。您不应键入castmalloc
return。你的功能有点奇怪。你为什么要做两次malloc?在第二个malloc
,您丢失了指向第一个malloc
上保存的数据的指针。您正在将大小设置为实际大小减去1。因此,您的for
循环将比您预期的少做一个。我添加了更多详细信息*原始数据=(传感器数据*)malloc(传感器数据)*((*大小)+1))代码>→ <代码>*raw_data=realloc(*raw_data,sizeof(sensor_data)*((*size)+1))代码>在malloc调用下面调用realloc 2行真的毫无意义。而是提前计算需要多少内存,然后调用malloc一次。事实证明,这里的大小始终为2,所以首先使用动态内存是没有意义的。@Lundin在这种情况下是的,然而,代码确实演示了一种简化的方法,即分配一些初始空间量,然后根据需要扩展该空间。如果realloc
位于控制条件包含外部参数的循环内,则会使其更具体。谢谢。另一个注意事项是,当使用C++编译器时,如果不返回返回值,编译器将抱怨。普普通通C环境工作非常完美,感谢您的帮助@dbush@KangminXu如果你在C++中使用MALOC,你做的非常错误。它不能与new/delete混合使用,也不会调用构造函数/析构函数。