动态分配内存

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态分配内存相关的知识,希望对你有一定的参考价值。

假设我想创建一个字符串数组

char** array=(char**)malloc(sizeof(char*)*1);
//option 1
array[0]=malloc(strlen(string)); array[0]=string;
//option 2
array[0]=string;

这样做的正确方法是什么?为什么?

我认为第一个选项很好,但Valgrind说它导致内存泄漏,因此应该被释放。但是,如果我没有为字符串分配内存,那么它会变成一个局部变量,然后在函数结束后立即被销毁?那为什么两个选项都有效?如果第一个选项是正确的,那么我应该如何释放内存以阻止泄漏?

答案

在选项1中

array[0]=malloc(strlen(string)); // need +1 see below
array[0]=string;

你通过malloc将array[0]设置为一个新的分配区域,然后用array[0]替换string值,因此初始分配的地址丢失了,valgrind告诉你。你可以做到

array[0]=malloc(strlen(string)+1); // +1 for trailing 0
strcpy(array[0], string);          // copy string into array[0]
... 
free (array[0]); // when you are done working with array[0]
free (array);    // when you are done working with array

选项2

array[0]=string;

很好。根据array[0]的创建方式,string字符可能会被修改或不被修改。

以上是关于动态分配内存的主要内容,如果未能解决你的问题,请参考以下文章

C - 读取文件并将文本放入具有动态内存分配的字符指针

简单动态内存分配实现(附代码)

golang 转到片段以观察运行时行为和内存分配

动态内存分配与静态内存分配

需要有关 C++ 中二维数组的动态内存分配的帮助

删除动态分配的内存