考虑以下代码:
#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]?
答案 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);
}
使用更正的版本:
- 分配给u的内存是否已释放?
u 是一个局部变量,它不是分配在堆中而是放置在堆栈中,从 foo 返回后,该局部变量不再存在,因此与 ua
字段相同
- 为u.b分配的内存是否已释放?
由 malloc 分配的内存(其指针保存在 ub 中)没有被释放,但是用于 ub 的内存在堆栈中,如下所示:对于 ua 或 u 本身,因此返回后该字段不再存在
- t.b等于向量[0,1,2]吗?
是,在深层复制之后, main 中的 tb 指向 malloc 分配的数组,然后在 foo
如果在 main 的末尾添加printf("%d %d %d\n", t.b[0], t.b[1], t.b[2]);
,它将打印0 1 2