Назначать символы один за другим указателю? - PullRequest
0 голосов
/ 29 января 2020

Мне нужен массив, скажем, из 10 указателей, которые указывают на массивы символов. Ради простоты, пусть все они указывают на один и тот же массив символов. Вот один из способов:

const int N = 10;
char arr[] = {'a', 'b', 'c', '\0'};
char *pArr[N] = {NULL};
for (int i = 0; i < N; i++)
     pArr[i] = &arr[0];

Вместо вызова pArr[i] = &arr[0], можно ли назначать символы один за другим? Что-то вроде:

for (int i = 0; i < N; i++)
     for (int j = 0; j < 3; j++)
          pArr[i][j] = arr[j];

кроме этого Кодовые ошибки. Должна ли правая часть назначения быть адресом?

РЕДАКТИРОВАТЬ: Я хочу иметь возможность удалить arr, но не потерять данные в pArr. Я думаю, мне просто нужен двумерный массив.

Ответы [ 3 ]

2 голосов
/ 29 января 2020

Но вместо того, чтобы вызывать pArr [i] = & arr [0], могу ли я назначать символы один за другим? Что-то вроде:

for (int i = 0; i < N; i++)
{
     for (int j = 0; j < 3; j++)
     {
          pArr[i][j] = arr[j];
     }
}

Если pArr[i] равно нулю, то pArr[i][j] = arr[j] перенаправляется через нулевой указатель и поведение программы не определено.

Вместо "вместо" Показанный фрагмент кода действительно действителен после того, как вы инициализировали указатели для указания (элементов) массива (ов) достаточного размера. Учитывая инициализацию в примере, все указатели указывают на один и тот же элемент одного и того же массива. Повторять одну и ту же модификацию на том же массиве было бы бессмысленно.

1 голос
/ 29 января 2020

Проблема в вашем коде (вызывающая ошибку сегментации) заключается в следующей строке:

pArr[i][j] = arr[j];

Теперь вы правы, предполагая, что, поскольку pArr является массивом указателей, вы можете использовать каждый его элементов (то есть parr[i]) как «массив»; однако вы можете только сделать это после того, как вы присвоили значение этому элементу (т. е. после того, как рассматриваемому элементу parr[i] был присвоен действительный адрес).

Итак, после выполнения вашего первого блока кода каждое значение pArr[i] будет указывать на данный массив, поэтому вы можете использовать pArr[i][j] для доступа к отдельным элементам этого массива.

Однако во втором блоке попытка присвоить значение pArr[i][j] заставляет компилятор (пытаться) разыменовать адрес, соответствующий каждому pArr[i], с добавленным к нему индексом j. Но элементам pArr[i] еще не присвоены значения, поэтому попытка не удалась.

Я не полностью уверен, чего вы пытаетесь достичь, но, если вы хотите, чтобы каждый элемент pArr, чтобы указать на «соответствующий» символьный элемент arr, тогда вы можете использовать код, подобный этому:

for (int i = 0; i < N; i++)
     pArr[i] = &arr[i];
0 голосов
/ 29 января 2020

Вот что вы пытаетесь сделать (пример с THREE таблицей различий):

const int N = 10;

char arr1[] = {'a', 'b', 'c', '\0'};
char arr2[] = {'d', 'e', 'f','g', '\0'};
char arr3[] = {'h', 'i', '\0'};
char* pArr[N] ;

pArr[0] = (char*) calloc ( 1, sizeof(arr1));
pArr[1] = (char*) calloc ( 1, sizeof(arr2));
pArr[2] = (char*) calloc ( 1, sizeof(arr3));


for (int i = 0; i < sizeof(arr1); i++)
    pArr[0][i] = arr1[i];

for (int i = 0; i < sizeof(arr2); i++)
    pArr[1][i] = arr2[i];

for (int i = 0; i < sizeof(arr3); i++)
    pArr[2][i] = arr3[i];

Обратите внимание, что вам нужно выделить память для вашего "pArr", иначе у вас будет ошибка сегментации

...