C ++ Простая передача указателя - PullRequest
0 голосов
/ 16 декабря 2011

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

Вот мой код:

#include <iostream>

using namespace std;

void createArray(char** dict, int* arraysize)
{
    *arraysize = 26*26*26*26;

    delete dict;
    dict = 0;

    //Initialisiere character array of character
    //char **wortliste = 0;
    dict = new char*[*arraysize];
    for(int i = 0; i < *arraysize; i++)
        dict[i] = new char[5];

    int ctr = 0;

    //Erstelle Einträge (sortiert)
    for (char i = 'A'; i <= 'Z'; i++)
    {
        for (char j = 'A'; j <= 'Z'; j++)
        {
            for (char k = 'A'; k <= 'Z'; k++)
            {
                for (char l = 'A'; l <= 'Z'; l++)
                {
                    dict[ctr][0] = i;
                    dict[ctr][1] = j;
                    dict[ctr][2] = k;
                    dict[ctr][3] = l;
                    dict[ctr][4] = '\0';
                    ctr++;
                }
            }
        }
    }
}

int main(void)
{
    char** dict = 0;
    int arraysize;

    createArray(dict, &arraysize);

    cout << dict[0] << endl << dict[arraysize-1] << endl;

    return 0;
}

Я не могу понять свою ошибку, большое спасибо заранее.

Ответы [ 3 ]

2 голосов
/ 16 декабря 2011

В C ++ параметры передаются по значению (если явно не помечены как ссылочные параметры), поэтому, когда вы передаете dict, указатель (на указатель на char) на createArray, dict внутри вашего Функция - это другой объект, хотя и с тем же начальным значением, что и dict в main. Если вы хотите увидеть изменения в dict в main, вам нужно будет передать его по ссылке или передать его адрес в функцию, получив char ***.

1012 * Е.Г. *

void createArray(char**& dict, int* arraysize)

или

void createArray(char*** pdict, int* arraysize)
{ // use (*pdict) instead of dict ...

и

// ...
createArray(&dict, &arraysize);

Более "C ++" способ добиться того, чего вы хотите, это иметь:

void createArray( std::vector<std::string>& dict );

и просто createArray измените размер vector до необходимого размера. Использование стандартных контейнеров, таких как vector и string, также освобождает вас от необходимости полностью освобождать память, которую вы выделяете, и которая в данный момент отсутствует в вашем коде.

1 голос
/ 16 декабря 2011

Есть пара ошибок.

  1. Чтобы удалить массив:

    char **array = /* new with whatever */;
    /* do your work */
    for (i = 0; i < array_size; ++i)
        delete[] array[i];
    delete[] array;
    
  2. Для создания нового массива:

    char **array = new char *[array_size];
    for (i = 0; i < array_size; ++i)
        array[i] = new char[array_size_2];
    
  3. Когда delete ing, чтобы убедиться, что вы не выполняете итерации по не- new ed массиву, проверьте его по NULL:

    for (i = 0; i < array_size; ++i)
    {
        if (array[i] != NULL)   /* Or simply if (array[i]) */
            delete[] array[i];
        array[i] = NULL;
    }
    if (array != NULL)
        delete[] array;
    array = NULL;
    

    альтернативно, так как delete делает проверку для NULL в любом случае, вы можете упростить это до:

    if (array != NULL)
        for (i = 0; i < array_size; ++i)
            delete[] array[i];  /* no need to set to NULL after if going to delete the array */
    delete[] array;
    array = NULL;
    

Примечание: delete удаляетодин объект, в то время как delete[] удаляет массив.

0 голосов
/ 16 декабря 2011

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

#include <iostream>
#include <vector>
#include <string>

using namespace std;

vector<string> create() {
    vector<string> result;
    for (char i = 'A'; i <= 'Z'; ++i) {
        for (char j = 'A'; j <= 'Z'; ++j) {
            for (char k = 'A'; k <= 'Z'; ++k) {
                for (char l = 'A'; l <= 'Z'; ++l) {
                    result.push_back(string() + i + j + k + l);
                }
            }
        }
    }
    return result;
}

int main() {
    vector<string> data = create();
    cout << data.front() << endl << data.back() << endl;
}
...