Функция Char * (указатель)

Мне нужно передать char * в функции и установить значение 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 

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

Итак, в вашей функции вы хотите изменить chunk . chunkchar * . Чтобы иметь возможность изменять значение 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 parameter вместо char *endptr - они хотят иметь возможность задать значение char * по адресу первый недопустимый символ, и единственный способ, которым они могут повлиять на char * в вызывающем, - получить указатель на него, т. е. получить char * . Аналогично, в вашей функции вы хотите изменить значение char * , что означает, что вам нужен указатель на char * .

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

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

Кажется, что вы попали по пропуску по значению, даже если это указатель, проблема. Кроме того, завершен ли fragment null?

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

 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); 

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