Как получить доступ к элементам массива char, передаваемых в качестве параметра функции в c? - PullRequest
0 голосов
/ 06 мая 2018

У меня есть эта функция, которая получает указатель на массив символов и инициализирует его как 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 голосов
/ 06 мая 2018

вместо присвоения

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

используйте это:

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

Но не забывайте, что строки C / C ++ заканчиваются нулем

Или вы можете использовать этот подход, чтобы получить более читаемый код:

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;
}
0 голосов
/ 06 мая 2018

Это более четко показывает, что вы должны делать, оставаясь близко к исходному коду:

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);
}
0 голосов
/ 06 мая 2018

s объявляется как указатель на указатель. В действительности это указатель на указатель на начало массива, но это не может быть выведено из одной только системы типов. С таким же успехом это может быть указатель на начало массива указателей, как s[i] относится к нему. Вам нужно сначала разархивировать s (чтобы получить указатель на начало массива), а затем индексировать по нему:

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

Кроме того, как правильно заметил @MFisherKDX в комментариях, если вы собираетесь передать *s в printf или любую другую стандартную функцию манипуляции со строками, вы должны превратиться в правильную строку C, завершив ее символ 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...