В 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 *
.
Надеюсь, это поможет.