局部结构变量与结构分配

时间:2019-05-01 10:31:14

标签: c

考虑以下代码:

#include <malloc.h>

typedef struct{
    int a;
    int* b; 
} test; 

void foo(test* t){
    test u = {.a = 1; .b = (test*) malloc(3*sizeof(test))}
    u.b[0]=0;
    u.b[1]=1;
    u.b[2]=2;
    *t=u; 
}

void main(){
    test t;
    foo(&t);
}

变量u是函数foo的局部变量。

我的问题是:变量u和t之后会发生什么 功能foo被执行了吗?

1. Is the memory allocated for u.a released? 
2. Is the memory allocated for u.b freed?
3. Is t.b equal to the vector [0,1,2]?

1 个答案:

答案 0 :(得分:2)

  

执行foo函数后,变量u和t会发生什么?

您提供的代码一无所有,因为由于许多原因它无法编译:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall c.c
c.c: In function ‘foo’:
c.c:7:21: error: expected ‘}’ before ‘;’ token
     test u = {.a = 1; .b = (test*) malloc(3*sizeof(test))}
                     ^
c.c:8:5: error: expected ‘,’ or ‘;’ before ‘u’
     u.b[0]=0;
     ^
c.c:11:6: error: incompatible types when assigning to type ‘test * {aka struct <anonymous> *}’ from type ‘test {aka struct <anonymous>}’
     t=u;
      ^
c.c:6:16: warning: parameter ‘t’ set but not used [-Wunused-but-set-parameter]
 void foo(test* t){
                ^
c.c: At top level:
c.c:14:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]
 void main(){
      ^~~~
c.c: In function ‘main’:
c.c:16:9: error: incompatible type for argument 1 of ‘foo’
     foo(t);
         ^
c.c:6:6: note: expected ‘test * {aka struct <anonymous> *}’ but argument is of type ‘test {aka struct <anonymous>}’
 void foo(test* t){
      ^~~

该代码的更正版本是:

#include <malloc.h>

typedef struct{
    int a;
    int* b; 
} test; 

void foo(test* t){
    test u = {.a = 1, .b = (int*) malloc(3*sizeof(test))};
    u.b[0]=0;
    u.b[1]=1;
    u.b[2]=2;
    *t=u; 
}

int main(){
    test t;
    foo(&t);
}

使用更正的版本:

  
      
  1. 分配给u的内存是否已释放?
  2.   

u 是一个局部变量,它不是分配在堆中而是放置在堆栈中,从 foo 返回后,该局部变量不再存在,因此与 ua

字段相同
  
      
  1. 为u.b分配的内存是否已释放?
  2.   

malloc 分配的内存(其指针保存在 ub 中)没有被释放,但是用于 ub 的内存在堆栈中,如下所示:对于 ua u 本身,因此返回后该字段不再存在

  
      
  1. t.b等于向量[0,1,2]吗?
  2.   

是,在深层复制之后, main 中的 tb 指向 malloc 分配的数组,然后在 foo

如果在 main 的末尾添加printf("%d %d %d\n", t.b[0], t.b[1], t.b[2]);,它将打印0 1 2