C 动态分配内存

C 动态分配内存,c,memory,memory-management,memory-leaks,C,Memory,Memory Management,Memory Leaks,假设我想创建一个字符串数组 char** array=(char**)malloc(sizeof(char*)*1); //option 1 array[0]=malloc(strlen(string)); array[0]=string; //option 2 array[0]=string; 正确的方法是什么?为什么 我认为第一个选项是可以的,但它会导致内存泄漏,因此应该释放。但是如果我没有为字符串分配内存,那么它就会变成一个局部变量,然后在函数结束后立即被销毁?那么为什么这两种选择都有效

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

char** array=(char**)malloc(sizeof(char*)*1);
//option 1
array[0]=malloc(strlen(string)); array[0]=string;
//option 2
array[0]=string;
正确的方法是什么?为什么

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

在选项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;
很好<代码>数组[0]字符可以修改或不修改,这取决于
字符串的创建方式。

在选项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;

很好<代码>数组[0]
字符可以修改或不修改,这取决于
字符串的创建方式。

这取决于
字符串的第一个分配位置,以及您是希望存储它的副本还是仅存储指向它的指针。第一个选项是内存泄漏,第二个选项存储指针。如果要存储副本,请使用第一个选项分配内存,然后使用
strcpy
复制数据,或者使用同时分配和复制的
strdup
。对于第二条语句,如果有权访问该内存的任何其他人更改了字符串,则该字符串将更改,如果该内存被释放,则访问它将成为未定义的行为。您没有正确执行选项1。分配存储,然后立即丢弃它,用
字符串替换指针。因此,除了内存泄漏之外,它与选项2是等效的。您不需要强制转换malloc返回值。这取决于
string
首先分配到的位置,以及您是希望存储它的副本还是仅存储指向它的指针。第一个选项是内存泄漏,第二个选项存储指针。如果要存储副本,请使用第一个选项分配内存,然后使用
strcpy
复制数据,或者使用同时分配和复制的
strdup
。对于第二条语句,如果有权访问该内存的任何其他人更改了字符串,则该字符串将更改,如果该内存被释放,则访问它将成为未定义的行为。您没有正确执行选项1。分配存储,然后立即丢弃它,用
字符串替换指针。因此,它与选项2相当,只是存在内存泄漏。不需要强制转换malloc返回值。