char *a() {
char *t = malloc(8);
t[0] = 'a';
t[1] = 'b';
//...
t[7] = 'h';
return t;
}
int main(void) {
char *x = a();
//do something with x
//...
free(x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个代码是否有任何潜在的问题,因为内存分配a()
和使用内存main()
?
Ed *_* S. 10
首先,a()被声明为返回void,但是您尝试返回char*.更改签名以返回char*.
其次,你的函数很好,但你的示例代码有内存泄漏,因为你永远不会释放返回的指针所指向的内存.
第三,正如gbrandt指出的那样,在调用malloc之后,你没有检查是否成功.malloc可能会失败,并检查它是否是一个良好的习惯进入.
另一种实现此目的的方法是将指针传递给指向()的指针,然后调用者必须在将指针传递给()之前自己创建指针,但无论哪种方式,您仍然需要释放内存.说实话,在这种情况下,我会采用你的方法.没有令人信服的理由这样做,只是想我会提到它.
void a(char **p)
{
*p = malloc(8);
if (*p)
{
**p[0] = 'a';
**p[1] = 'b';
...
**p[7] = 'h';
}
}
int main(void)
{
char *x;
a(&x);
//do something with x
.....
free(x);
}
Run Code Online (Sandbox Code Playgroud)
如果这种替代方法让您感到困惑,请告诉我,因为我很乐意提供解释(但是,此刻,我需要重新开始工作!)