c文件中指针的初始值是多少
在下面的代码中,是否可能导致一些内存泄漏c文件中指针的初始值是多少,c,android,embedded,C,Android,Embedded,在下面的代码中,是否可能导致一些内存泄漏 reference-ril.c static void requestRadioPower(void *data, size_t datalen, RIL_Token t) { .... ATResponse *p_response = NULL; .... err = at_send_command(cmd, &p_response); // it's a memory leakage or not ?
reference-ril.c
static void requestRadioPower(void *data, size_t datalen, RIL_Token t)
{
....
ATResponse *p_response = NULL;
....
err = at_send_command(cmd, &p_response); // it's a memory leakage or not ?
....
at_response_free(p_response);
....
}
在其他功能方面:
static void requestOrSendPDPContextList(RIL_Token *t)
{
ATResponse *p_response;
....
err = at_send_command_multiline ("AT+CGACT?", "+CGACT:", &p_response);
// it's a leakage or not ?
....
at_response_free(p_response);
....
}
实际上,在某些情况下,这些函数将在调用at_response_free(p_response)之前返回。
我想我们先把一个响应设置为NULL,对吗?
将指针设置为NULL是否是个好主意?将指针设置为NULL肯定是个好主意;但这两种情况都不是内存泄漏
C中指针的初始值是垃圾,任何未初始化变量的初始值也是垃圾。(有人告诉我,这是因为效率,需要记住。)将指针设置为null肯定是个好主意;但这两种情况都不是内存泄漏 C中指针的初始值是垃圾,任何未初始化变量的初始值也是垃圾。(有人告诉我,这是因为效率,需要记住。)这取决于:
- 如果
和at\u send\u command\u multiline
查看其各自的最后参数(at\u send\u command
)所指向的值,则应将其设置为可预测值。这可能意味着您将&p\u response
设置为p\u response
。如果函数在不查看初始值的情况下为指针分配内存,那么就可以了。为了回答您的特定问题,函数中声明的变量没有默认值,除非声明为NULL
static
- 如果
函数始终为最后一个参数分配内存,则必须释放内存。如果他们只在成功的情况下分配,那么你必须只在成功的情况下释放。一个简单的规则是,对于每个at\u send\u命令*
或malloc()
,都应该有一个calloc()
。(free()
稍微改变了这一点,但您现在不必担心它)realloc()
at_send_command*
函数的文档,或者查看函数的定义以完整回答您的问题。这取决于:
- 如果
和at\u send\u command\u multiline
查看其各自的最后参数(at\u send\u command
)所指向的值,则应将其设置为可预测值。这可能意味着您将&p\u response
设置为p\u response
。如果函数在不查看初始值的情况下为指针分配内存,那么就可以了。为了回答您的特定问题,函数中声明的变量没有默认值,除非声明为NULL
static
- 如果
函数始终为最后一个参数分配内存,则必须释放内存。如果他们只在成功的情况下分配,那么你必须只在成功的情况下释放。一个简单的规则是,对于每个at\u send\u命令*
或malloc()
,都应该有一个calloc()
。(free()
稍微改变了这一点,但您现在不必担心它)realloc()
换句话说,您需要查看
at_send_command*
函数的文档,或者查看函数的定义以完整回答您的问题。@Alok-“要回答您的特定问题,函数中声明的变量,除非声明为静态,否则没有默认值。”,不仅没有默认值,还可以是任何值。因为它不是声明为静态的,所以它是在堆栈上创建的,并且不是自动初始化的,因此可以有任何可能留在堆栈上的值。@西蒙:你说得对,不过我避免使用“堆栈”这个词对于自动初始化的变量:就C标准而言,可能有也可能没有堆栈。@Alok-“为了回答您的特定问题,在函数中声明的变量,除非声明为静态,否则没有默认值。”这里更清楚一点,不仅没有默认值,还可以是任何值。因为它不是声明为静态的,所以它是在堆栈上创建的,并且不是自动初始化的,因此可以有任何可能留在堆栈上的值。@simon:你是对的,尽管我避免使用“堆栈”这个词来表示自动初始化的变量:就C标准而言,可能有也可能没有堆栈。