如何访问作为参数传递给char函数的char数组元素?

时间:2018-05-06 18:46:16

标签: c arrays pointers

我有这个函数接收一个指向char数组的指针并将其初始化为len重复的" a":

void test(char ** s, int len) {
    *s = (char *)malloc(sizeof(char) * len);
    int i;
    for(i = 0; i < len; i++) {
        *(s[i]) = 'a';
    }
    printf("%s\n", *s);
}
main()中的

我有这段代码:

char * s;
test(&s, 3);

但是当我运行EXC_BAD_ACCESS (code=1, address=0x0)时出现main()错误。在此行的for循环的第二次迭代中发生错误:*(s[i]) = 'a';

据我所知,我没有正确访问这些元素,这是正确的方法吗?

3 个答案:

答案 0 :(得分:3)

s被声明为指针的指针。实际上,它是指向数组开头的指针的指针,但这不能仅从类型系统中推断出来。它也可以是一个指针数组开头的指针,这就是s[i]对待它的方式。你需要首先解除s(获取指向数组开始的指针),然后对其进行索引:

(*s)[i] = 'a';

另外,正如@MFisherKDX在评论中正确指出的那样,如果你要将*s传递给printf或任何其他标准字符串操作函数,你必须变成一个正确的C字符串,以0字符结尾。

答案 1 :(得分:3)

这更清楚地显示了您应该做什么,同时保持接近原始代码:

void test(char ** s, int len) {
    char *p = malloc(len);
    int i;
    for(i = 0; i < len; i++) {
        p[i] = 'a';
    }
    printf("%s\n", p);
    *s = p;
}

请注意,根据定义,sizeof(char)始终是一个,而在C中则无需转换malloc()的结果。

该代码还包含所有原始问题,因为它实际上并未创建可以发送到printf( "%s... )的字符串。这解决了这个问题:

void test(char ** s, int len) {
    char *p = malloc(len+1);
    int i;
    for(i = 0; i < len; i++) {
        p[i] = 'a';
    }
    p[i]='\0';
    printf("%s\n", p);
    *s = p;
}

这更容易,不需要使用双重*指针:

char *test(int len) {
    char *p = malloc(len+1);
    int i;
    for(i = 0; i < len; i++) {
        p[i] = 'a';
    }
    p[i]='\0';
    printf("%s\n", p);
    return(p);
}

答案 2 :(得分:1)

而不是作业

*(s[i]) = 'a';

使用它:

(*s)[i] = 'a';

但不要忘记C / C ++字符串是null terminated

或者您可以使用此方法获得更易读的代码:

void test(char** s, int len) {
    // 1 char extra for zero
    char *str = (char*)malloc(sizeof(char) * (len+1));

    int i;
    for(i = 0; i < len; i++)
        str[i] = 'a';

    // zero terminated string
    str[len] = 0;

    printf("%s\n", str);

    *s = str;
}