Функция Char * (указатель) - PullRequest
1 голос
/ 09 февраля 2010

Мне нужно передать символ * в функцию и установить для него значение cstring. Я могу правильно установить ее как строку в функции, но она, похоже, не распечатывается правильно в функции, которая сначала вызывала функцию char *.

int l2_read(char *chunk,int length)
{
    chunk = malloc( sizeof(char) * length);

    int i;
    for(i = 0; i < length; i++){
       char c;
       if(read(&c) < 0) return (-1); // this gets a single character
          chunk[i] = c;
    }

    printf("%s",chunk); // this prints fine
    return 1;
}


    // main
    char *string;
    int value = l2_read(string,16);
    printf("%s",chunk); // prints wrong

Ответы [ 4 ]

14 голосов
/ 09 февраля 2010

В C все передается по значению. Общее правило, которое нужно помнить, это то, что вы не можете изменить значение параметра, передаваемого в функцию. Если вы хотите передать что-то, что нужно изменить, вам нужно передать указатель на него.

Итак, в вашей функции вы хотите изменить chunk. chunk - это char *. Чтобы иметь возможность изменить значение char *, вам нужно передать указатель на него, то есть char **.

int l2_read(char **chunkp, int length)
{
    int i;
    *chunkp = malloc(length * sizeof **chunkp);
    if (*chunkp == NULL) {
        return -2;
    }
    for(i = 0; i < length; i++) {
        char c;
        if (read(&c) < 0) return -1;
        (*chunkp)[i] = c;
    }
    printf("%s", *chunkp);
    return 1;
}

, а затем в main():

 char *string;
 int value = l2_read(&string, 16);
 if (value == 1) {
     printf("%s", string); /* corrected typo */
     free(string); /* caller has to call free() */
 } else if (value == -2) {
    /* malloc failed, handle error */
 } else {
    /* read failed */
    free(string);
 }

Передача по значению в C является причиной, по которой strtol(), strtod() и т. Д. Требуется параметр char **endptr вместо char *endptr - они хотят иметь возможность установить значение char * в адрес первого недопустимого символа и единственный способ, которым они могут повлиять на char * в вызывающей стороне, - это получить указатель на него, т. е. получить char *. Точно так же в вашей функции вы хотите иметь возможность изменять значение char *, что означает, что вам нужен указатель на char *.

Надеюсь, это поможет.

2 голосов
/ 09 февраля 2010

Вы должны передать указатель на указатель.

int l2_read(char **chunk,int length)
{
    *chunk = malloc( sizeof(char) * length);

     int i;
     for(i = 0; i < length; i++)
     {
         char c;
         if (read(&c) < 0) return (-1);
         (*chunk)[i] = c;
     }

     printf("%s",*chunk);
     return 1;

}

    char *string;
    int value = l2_read(&string,16);
    printf("%s",string);
2 голосов
/ 09 февраля 2010

Я просто перечитал ваш вопрос.

Похоже, что вы попали в проходное значение, даже если это указатель, проблема Кроме того, завершен ли нулевой блок?

0 голосов
/ 09 февраля 2010

Я полностью согласен с ответом, опубликованным выше. Вы по существу изменяете значение указателя, поэтому вам нужно передать ссылку на указатель. используйте char ** вместо char *.

...