In C, everything is passed by value. A general rule to remember is, you can't change the value of a parameter passed to a function. If you want to pass something that needs to change, you need to pass a pointer to it.
So, in your function, you want to change chunk
. chunk
is char *
. To be able to change the value of the char *
, you need to pass a pointer to that, i.e., 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;
}
and then in 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);
}
Pass-by-value in C is the reason why strtol()
, strtod()
, etc., need char **endptr
parameter instead of char *endptr
—they want to be able to set the char *
value to the address of the first invalid char, and the only way they can affect a char *
in the caller is to receive a pointer to it, i.e., receive a char *
. Similarly, in your function, you want to be able to change a char *
value, which means you need a pointer to a char *
.
Hope that helps.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…