c中的struct语句,这两个语句会有区别吗?

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? // *** }

在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?
  // ***
}

在B中,如果a为真时返回,bb是否会成为内存泄漏?

否,它不会成为内存泄漏,因为没有动态分配。您需要调用
malloc
,或
calloc
而不使用相应的
free
来泄漏内存


在代码中,您只是声明了一个指向结构的指针。

在代码段a中,如果条件
a
变为true,则函数将返回并
asdf*bbbb
将始终被声明为独立于
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
所指向的内存,因此当涉及内存泄漏时,不可能存在内存泄漏:您没有忘记释放动态分配的内存,因为根本没有动态分配的内存。