2015-10-11 2 views
-1

В коде A, если функция tInit (test ts) вызывается для инициализации структуры, элементы не назначаются, если код tInit (test ts) не перемещен в main(). Это потому, что область ts в tInit (test ts) ограничена внутри функции?Указатель как функция Аргумент в C

В коде C, после вызова tInit (tt), tt остается NULL, что также приводит к ошибке сегментации. Какова причина?

В коде B результат - это то, что я хочу. Является ли код безопасным для памяти?

#include <stdio.h> 
#include <stdlib.h> 

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

// A 
void tInit(test ts) { 
    ts.a = 1; 
    ts.b = 2; 
} 

int main(){ 
    test tt; 
    tInit(tt); 
    printf("%d, %d\n", tt.a, tt.b); 
    return 0; 
} 

// B 
void tInit(test **ts){ 
    *ts = (test*)malloc(sizeof(test)); 
    (*ts)->a = 1; 
    (*ts)->b = 2; 
} 

int main(){ 
    test *tt = NULL; 
    tInit(&tt); 
    printf("%d, %d\n", tt->a, tt->b); 
    return 0; 
} 

// C 
void tInit(test *ts){ 
    ts = (test*)malloc(sizeof(test)); 
    ts->a = 1; 
    ts->b = 2; 
} 

int main(){ 
    test *tt = NULL; 
    tInit(tt); 
    printf("%d, %d\n", tt->a, tt->b); 
    return 0; 
} 
+1

Пожалуйста, прочитайте книгу. переполнение стека не является учебным сайтом! У вас есть ** конкретная ** проблема? – Olaf

+0

Это базовый язык программирования C, пожалуйста, прочитайте основную книгу C. –

ответ

0

C является строго «переходящим значением». Это означает, что каждой функции предоставляется копия параметров, которые вы передаете им.

В коде «A» копия tt передается tInit() как ts, которая существует только для срока службы функции. Когда функция выходит, у вас больше нет доступа к ней.

Код "C" показывает то же поведение. Причина, по которой указатель tt остается NULL, заключается в том, что указатель копируется и передается функции. Вы только переназначаете значение скопированного указателя, а не оригинал.

Способ обойти это ваш код «B». Вы передаете указатель на указатель test. Таким образом tInit() может переназначать исходный указатель ts. Я не совсем уверен, что вы подразумеваете под «безопасным для памяти», но если это означает, что вы беспокоитесь об утечке памяти, у вас ее есть. Просто позвоните free(ts) после того, как вы закончите использовать его.

Смежные вопросы