Char *(指针)功能

时间:2010-02-09 05:53:09

标签: c 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

4 个答案:

答案 0 :(得分:14)

在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中的按值传递是strtol()strtod()等需要char **endptr参数而不是char *endptr的原因 - 他们希望能够将char *值设置为第一个无效字符的地址,它们影响调用方char *的唯一方法是接收指向它的指针,即接收char * 。同样,在您的函数中,您希望能够更改char *值,这意味着您需要指向char *的指针。

希望有所帮助。

答案 1 :(得分:2)

我刚刚重新阅读了你的问题。

你似乎被传递值击中了,即使它是指针问题。还有,块空终止了吗?

答案 2 :(得分:2)

您必须将指针传递给指针。

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

答案 3 :(得分:0)

我完全赞同上面的答案。您实际上是修改指针的值,因此您需要传递指针的引用。使用char **而不是char *。