Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C编程:另一个函数中的动态malloc_C - Fatal编程技术网

C编程:另一个函数中的动态malloc

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.

所以我尝试在其他函数中动态地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.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
函数中,首先为1
sendor\u data
数组分配空间,然后写入,这很好。但是您随后为一个新数组分配了空间,这次为2个元素分配了空间,并覆盖指向原始分配内存的指针。因此,松开原始内存块,只写入新块的第二个元素

在第二种情况下,您需要的不是
malloc
,而是
realloc
。此功能允许您调整已分配内存块的大小,并将旧块中的任何数据保留在新块中。如果新块较大,则会取消初始化其他字节。如果新块较小,则旧块中的数据将被截断为新块的大小

因此,将您的第二个
malloc
调用更改为
realloc

*raw_data = realloc(*raw_data, sizeof(sensor_data) * ((*size) + 1));

另外,您应该测试
malloc
realloc
的结果,看看它们是否返回了
NULL
,以及。

除了明显的内存泄漏之外,它以什么方式不起作用?挑剔:要么是malloc,要么是动态分配。挑一个,几个问题。您不应键入cast
malloc
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混合使用,也不会调用构造函数/析构函数。