Когда вы вызываете 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
}
person
Phil
schedule
20.05.2010