Когда вы звоните function(str)
, вы передаете значение от str
до function
. Это значение является неинициализированным значением мусора, потому что вы не установили его в main
, но это не проблема.
Проблема в том, что function
имеет свой собственный указатель, var
, в который он помещает это значение мусора, чтобы можно было сказать var points to the same thing (garbage) that str points to
. Однако они не являются одной и той же переменной. Это две разные переменные, и изменение var
не влияет на str
.
Когда вы говорите var = (char*) malloc (100);
, вы выделяете память где-то, а затем говорите var
, чтобы указать на нее. Теперь var
указывает на местоположение, отличное от str
. Вы сразу же возвращаетесь из этой функции, теряя var
и расположение этой памяти. Это, кстати, утечка памяти.
Когда вы вернетесь к main
, str
будет таким, каким он был когда-то, - указывая на мусор.
Числовой пример:
char *str; // str -> 0xfeedface (garbage)
function(str);
// inside 'function', an initialization like this occurs
char *var = str; // var -> 0xfeedface (same garbage)
var = (char*) malloc (100); // var -> 0x12341234 (alloc'd memory)
return;
// back in 'main'
strcpy(str, "some random string"); // str still points to 0xfeedface!
Чтобы сделать это правильно, вам нужно изменить значение str
s. Это означает, что function
нужен указатель на str
или указатель на указатель .
void function(char **var)
{
*var = (char*)malloc(sizeof(char) * 100);
}
int main()
{
char *str;
function(&str);
strncpy(str, "some random string", 99);
...
free(str); // important in general
}