Разыменовывание char * array [] и сохранение в char ** array [] (C) - PullRequest
0 голосов
/ 30 мая 2020

Редактировать. Извините за минимальную информацию, включенную ранее

Скажем, у меня есть следующий код:

    char ** a[16];
    a[15] = '\0';

    int i;
    for (i = 0; i < 5; i++) {

        char * b[3];
        b[2] = '\0';

        b[0] = "foo";
        b[1] = "bar";

        if (i == 4) {
            b[0] = "hello";
            b[1] = "world";
        }

        a[i] = b;
    }

Прямо после for l oop, если я включу следующие две строки:

printf("%s %s\n", a[0][0], a[0][1]);
printf("%s %s\n", a[4][0], a[4][1]);

Я хочу, чтобы результат был:

foo bar
hello world

Однако вместо этого:

hello world
hello world

Я знаю, что это из-за моего объявления, a[i] = b;, где b - массив указателей на символы. Каждый l oop, указатели на символы, на которые указывают b [0] и b [1], изменяются.

В финальном l oop они установлены на «привет» и «мир» соответственно. Поскольку я назначил b для a [i], каждый индекс a теперь указывает на одно и то же.

Я хотел бы разыменовать b, чтобы a [i] было присвоено значение b, на которое указывает а не сама b. Поэтому после l oop все индексы a не совпадают.

Я пробовал использовать следующее, но оба результата привели к ошибкам сегментации:

*a[i] = *b и **a[i] = **b

Любая помощь будет принята с благодарностью, так как я полностью потерялся. Спасибо :)

1 Ответ

0 голосов
/ 30 мая 2020

Я бы хотел разыменовать b, чтобы a [i] было присвоено значение, на которое указывает b, а не само b. Поэтому после l oop все индексы a не совпадают.

Обратите внимание, что b сам по себе является массивом, поэтому вы не можете просто назначить value b points to rather than b itself, потому что b не указывает на одно значение .

Чтобы действительно это сделать (не знаю, зачем вам это нужно), замените строку:

a [i] = b;

a[i][0] = b[0];
a[i][1] = b[1];
a[i][2] = b[2];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...