c中的struct语句,这两个语句会有区别吗?
在c源代码中,A和B会有区别吗c中的struct语句,这两个语句会有区别吗?,c,C,在c源代码中,A和B会有区别吗 typedef struct asdf { int aa; int bb; } asdf; // A void func1(int a) { if(a) return; asdf *bb; //**** } // B void func1(int a) { asdf *bb; if(a) return; // if return here, will bb become a memory leak? // *** }
typedef struct asdf {
int aa;
int bb;
} asdf;
// A
void func1(int a) {
if(a) return;
asdf *bb;
//****
}
// B
void func1(int a) {
asdf *bb;
if(a) return; // if return here, will bb become a memory leak?
// ***
}
在B中,如果a为真时返回,bb是否会成为内存泄漏?否,它不会成为内存泄漏,因为没有动态分配。您需要调用
malloc
,或calloc
而不使用相应的free
来泄漏内存
在代码中,您只是声明了一个指向结构的指针。在代码段a中,如果条件
a
变为true,则函数将返回并asdf*bb当在代码段B中,bb
将始终被声明为独立于if
的条件时,将无法访问code>
在B中,如果a为真时返回,bb是否会成为内存泄漏
如果bb
在代码中动态分配内存,则会导致内存泄漏
内存泄漏的一个例子
void func1(int a) {
asdf *bb = malloc(10*sizeof(asdf));
if(a) return;
/* some other stuff */
free(bb);
}
如果a
变为true
,则会出现内存泄漏。取决于C89中的示例a是错误。但最好的方法是检查汇编代码。您实际上在哪里为asdf
分配内存@眠りネロク 它只是向堆栈中添加了变量。如果不分配内存,就不会发生泄漏。@SchwiftyMcSchwifulface堆栈上实际分配的是bb
。您甚至不知道OP在问什么@tilz0R我已经回答了OP提出的问题,在B中是否存在由于提前返回而导致的内存泄漏。请解释您是如何得出结论的?OP是询问如果交换了语句和变量声明,代码执行是否有差异。所以并没有内存泄漏,因为并没有分配,我也不认为有必要分配任何东西,因为变量从未被使用过!正确答案是哈克斯的。@Sato他们不是。检查HACKS答案是否正确。@Colin\u\s;这是因为编译器优化。因为asdf*bb代码>在给定代码段中的任何地方都没有使用,因此编译器会优化代码。即使声明了bb
,也没关系,对吗?因为没有内存泄漏。@Sato;在动态分配内存之前,内存泄漏不会出现。只有声明不会起任何作用。@Sato在代码中,没有动态内存分配。所以,没有内存泄漏。@Sato案例B应该只被允许。在C89中就是这种情况。@Sato您没有分配bb
所指向的内存,因此当涉及内存泄漏时,不可能存在内存泄漏:您没有忘记释放动态分配的内存,因为根本没有动态分配的内存。