Char *(指针)function
我需要在函数中传入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
。 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中的pass-by-value是strtol()
, strtod()
等需要char **endptr
参数而不是char *endptr
- 他们希望能够将char *
值设置为地址第一个无效的char,它们可以影响调用者中的char *
的唯一方法是接收指向它的指针,即接收char *
。 同样,在您的函数中,您希望能够更改char *
值,这意味着您需要一个指向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); (*chunk)[i] = c; } printf("%s",*chunk); return 1; } char *string; int value = l2_read(&string,16); printf("%s",string);
我完全同意上面的答案。 您实际上是修改指针的值,因此您需要传递指针的引用。 使用char **而不是char *。