假设我想创建一个字符串数组
char** array=(char**)malloc(sizeof(char*)*1);
//option 1
array[0]=malloc(strlen(string)); array[0]=string;
//option 2
array[0]=string;
这样做的正确方法是什么?为什么?
我认为第一个选项很好,但Valgrind说它导致内存泄漏,因此应该被释放。但是,如果我没有为字符串分配内存,那么它会变成一个局部变量,然后在函数结束后立即被销毁?那为什么两个选项都有效?如果第一个选项是正确的,那么我应该如何释放内存以阻止泄漏?
答案 0 :(得分:2)
在选项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
的创建方式。