Передать по адресу (указатель) - PullRequest
0 голосов
/ 31 января 2019
void fun(char* name);

int main(){
    char* name = NULL;
    fun(name);
    printf("%s",name);
}

void fun(char* name){
    char input[SIZE];
    int length;

    printf("Please enter a name:\n");
    scanf("%s",input);
    length = strlen(input);
    name = (char*)malloc(sizeof(char)*length+1);
    if(name == NULL){
        exit(1);
    }
    strcpy(name, input);
}

Чего мне не хватает, я пытаюсь присвоить строку указателю, область действия malloc не только в функции, так в чем же ошибка?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Вы передаете копию указателя, меняете этот указатель и не отправляете указатель обратно.Любые изменения в name существуют только внутри этой функции, если только вы не передаете двойной указатель или вместо этого используете простой подход для возврата значения.

Переработайте функцию, чтобы вернуть указатель, который вы можете использовать:

char* fun() {
    char input[SIZE];
    int length;

    printf("Please enter a name:\n");
    scanf("%s",input);
    length = strlen(input);

    char* name = malloc(sizeof(char)*length+1);

    if(name == NULL){
        exit(1);
    }
    strcpy(name, input);

    return name;
}

Затем, когда вы его вызываете, вы можете выполнить прямое назначение:

int main(){
    char* name = fun();

    printf("%s",name);

    free(name);

    return 0;
}

Нет смысла передавать указатель.Независимо от того, какой указатель вы передадите, он будет изменен, исходное значение не будет использовано, что означает, что это бесполезно.

Помните, что вам не нужно предварительно объявлять свои функции, если вы объявляете main() последним, как это принято,Не забудьте также return и int в этой функции.При компиляции используйте -Wall для предупреждения о распространенных ошибках.

0 голосов
/ 31 января 2019

вам нужно сделать name выходным параметром, если вы продолжаете давать его в качестве параметра, в настоящее время он является только локальным и никаких изменений не видно за пределами fun

void fun(char** name);

int main(){
    char* name = NULL;
    fun(&name);
    printf("%s",name);
}

void fun(char** name){
    char input[SIZE];
    int length;

    printf("Please enter a name:\n");
    scanf("%s",input);
    length = strlen(input);
    *name = (char*)malloc(sizeof(char)*length+1);
    if(*name == NULL){
        exit(1);
    }
    strcpy(*name, input);
}

Как видите, я даю адрес переменной name , позволяющей изменить ее значение в fun , поэтому тип является указателем на char*, являющимся char**

Выполнение:

pi@raspberrypi:/tmp $ ./a.out
Please enter a name:
aze
aze

Вам не хватает свободного имя

Предупреждение : если входное значение больше SIZE у вас будет неопределенное поведение при записи input , предполагая, что SIZE не является константой или может измениться позже, лучше сделать что-то подобное:

void fun(char** name){
    char input[SIZE];
    int length;
    char fmt[16];

    printf("Please enter a name:\n");

    sprintf(fmt, "%%%ds", SIZE);
    scanf(fmt, input);
    length = strlen(input);
    *name = (char*)malloc(sizeof(char)*length+1);
    if(*name == NULL){
        exit(1);
    }
    strcpy(*name, input);
}

Как видите, я делаю формат scanf , например, если SIZE значения 10, используемый формат будет "% 10s"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...