Локальные переменные структуры против присвоения структур - PullRequest
0 голосов
/ 01 мая 2019

Рассмотрим следующий код:

#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 Ответ

2 голосов
/ 01 мая 2019

Что происходит с переменными 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);
}

Использование исправленной версии:

  1. Выделена ли свободная память для 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...