Что происходит с переменными u и t после выполнения функции foo?
ничего с кодом, который вы даете, потому что он не может скомпилироваться по многим причинам:
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);
}
Использование исправленной версии:
- Выделена ли свободная память для ua?
u - локальная переменная, она не размещается в куче, а помещается в стек после возврата из foo локальной переменнойбольше не существует, поэтому то же самое для поля ua
Выделена ли память для ub?
память, выделенная для malloc , чей указатель был сохранен в ub , не освобождаетсяно память, используемая для ub , находится в стеке, как для ua или u , поэтому после возврата поля больше не существуют
ТБ равно вектору [0,1,2]?
да после глубокого копирования с коррекцией, ТБ в main указывает на массив, выделенный malloc , затем задается в foo
, если вы добавите printf("%d %d %d\n", t.b[0], t.b[1], t.b[2]);
в конце main , он напечатает0 1 2