Могу ли я выполнять операции над массивом символов и отдельными символами после передачи по ссылке на другую функцию? - PullRequest
2 голосов
/ 13 апреля 2019

Я хочу инициализировать массив символов, а затем передать его в функцию, которая анализирует аргументы командной строки.Я хочу, чтобы эта функция перезаписывала массив символов во входной аргумент из командной строки, а затем выполняла некоторые синтаксические проверки отдельных символов в этом массиве.

Я не показываю исходный код, над которым я работал, но я думаю, что у меня есть пример программы, чтобы выделить то, с чем я борюсь

#include <stdio.h>
#include <stdlib.h>

void changeArray(char **arr){
    printf("Array is %s\n",*arr);
    printf("This character is %c\n",*arr[0]);
    printf("This character is %c\n",*arr[1]); //segmentation fault here
    printf("This character is %c\n",arr[2]);
    printf("This character is %c\n",arr[3]);
    printf("This character is %c\n",arr[4]);
    *arr = "bingo";
    printf("Array is %s\n",*arr);
    printf("This character is %c\n",arr[0]);
    printf("This character is %c\n",arr[1]);
    printf("This character is %c\n",arr[2]);
    printf("This character is %c\n",arr[3]);
    printf("This character is %c\n",arr[4]);
}

int main(int argc, const char* argv[]){
    char *blah = "hello";
    printf("Array is %s\n",blah);
    printf("This character is %c\n",blah[0]);
    printf("This character is %c\n",blah[1]);
    printf("This character is %c\n",blah[2]);
    printf("This character is %c\n",blah[3]);
    printf("This character is %c\n",blah[4]);
    changeArray(&blah);
    printf("This character is %c\n",blah[0]);
    printf("This character is %c\n",blah[1]);
    printf("This character is %c\n",blah[2]);
    printf("This character is %c\n",blah[3]);
    printf("This character is %c\n",blah[4]);
    printf("Array is %s\n",blah);
    return 0;
}

Это вывод программы, первый индекс в массиве символов печатает букву 'h', как яожидать, но любой другой индекс заставляет меня выйти за пределы:

Array is hello
This character is h
This character is e
This character is l
This character is l
This character is o
Array is hello
This character is h
Segmentation fault

Ответы [ 2 ]

3 голосов
/ 13 апреля 2019

У вас проблема с порядком операций. Приоритет оператора гласит, что операция [] выполняется до разыменования указателя, поэтому вы по существу продвинулись до второго указателя в массиве символьных указателей, а затем разыменовали первый элемент. Вы хотите запустить (*arr)[1], чтобы трактовать arr как указатель на массив, а не как массив указателей.

https://en.cppreference.com/w/cpp/language/operator_precedence

1 голос
/ 13 апреля 2019

Приоритет оператора индекса массива ([]) выше, чем у оператора разыменования указателя (*).Так что *arr[1] эквивалентно *(arr[1]).Но arr имеет только один элемент (это просто адрес blah), поэтому arr[1] недопустим для доступа (не говоря уже о разыменовании).

Для достижения того, что вы хотитевам придется либо использовать круглые скобки ((*arr)[1]), либо использовать оператор нижнего индекса вместо оператора разыменования для разыменования верхнего уровня (arr[0][1]).

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