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中,一切都按值传递。 要记住的一般规则是,您不能更改传递给函数的参数的值。 如果要传递需要更改的内容,则需要传递指针。

因此,在您的函数中,您想要更改chunkchunkchar * 。 为了能够更改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 *。