При вызове 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
сек значение. Это означает, что 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
}
Когда вы говорите «не работает», было бы полезно знать, что * об этом не работает. Детали хороши. –
Извините. Забыл упомянуть об этом. Он компилируется, но когда я запускаю его, я получаю ошибку сегментации. – nunos
Ваш код работает точно так, как предполагалось. Если вы думаете, что что-то «не работает», вы должны объяснить, что это такое. Без этого ваш вопрос не имеет никакого смысла. – AnT