После долгого времени, потраченного на создание этого кода, может кто-нибудь объяснить мне, почему мне нужно 2 звезды, когда я передаю указатель на строку в качестве аргумента функции ? Указатель по определению хранит адрес в памяти, где будет помещена определенная переменная. Таким образом, это переменная, которая имеет свой собственный адрес и по этому адресу адресует другую переменную. Хорошо. Поэтому, если я передаю указатель на функцию, я использую амперсанд, потому что я должен передать адрес указателя функции. Хорошо. Но тогда что происходит. Функция получает информацию, в которой в памяти находится этот указатель. Хорошо. Это то, что я понимаю. Я не понимаю, почему мне нужно две звезды, когда я определяю функцию и ее аргумент. Я передаю указатель на переменную char. Почему не void wpisuj (char * w). Почему wpisuj (char ** w). Распределение памяти для меня понятное - я зарезервировал память с malloc, и malloc возвращает адрес этой памяти, поэтому я поместил этот адрес как значение переменной w. И снова что-то я не понимаю, если * w является указателем и сохраняет адрес вновь созданного места в памяти, почему я использую * w для размещения там строки. Если это не будет * (* w)? Так как * w - адрес зарезервированной памяти, то * (* w) является содержимым этой памяти.Почему 2 звезды при передаче указателя на строку функции
Подведение итогов. Я не понимаю: 1) почему wpisuj (char ** w) вместо wpisuj (char * w) 2) почему strcpy (w, bufor) вместо strcpy ( (* w), bufor)
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
# define SIZE 256
void wpisuj(char** pw){
char bufor[256];
scanf("%s", bufor);
int l;
l=strlen(bufor)+1;
*pw=(char*)malloc(l*sizeof(char));
strcpy(*pw, bufor);
}
int main(){
char* w;
wpisuj(&w);
printf("%s", w);
return 0;
}
И если я могу спросить о освобождении памяти. Я правильно думать, что это Corect количество звезд (как в коде ниже):
void free_memory(char **w){
free(*w);
}
, но, если бы я освободил память в основной() я бы:
int main(){
w=malloc(sizeof(buffer)+sizeof(char));
/* some code before */
free(w);
}
Две звезды, потому что это указатель на указатель .... – duffymo
'*' = указатель. '**' = указатель на указатель. это все –
Это поможет, если вы используете другое имя переменной в функции.Функция 'w' является указателем на' w' основного. Возможно, назовите его 'pw'. Тогда '* pw' в функции означает ту же переменную, что и' w' в main. –