Многомерный массив как проблема плоского массива - PullRequest
2 голосов
/ 23 марта 2011

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

char** array = (char**) new char [2] [6];

std_strlprintf(array[0],6,"[%d]", num);

std_strlprintf - это функция Brew, которая пишет в отформатированном видевывод в строку.(num - это целое значение, равное 0)

Почему с этим кодом есть исключение, что не так при доступе к первому элементу массива как buff [0]?


РЕДАКТИРОВАТЬ: извините, что была опечатка в моей первоначальной публикации.Это исправлено сейчас.Это код, который имеет исключение.

1 Ответ

6 голосов
/ 23 марта 2011

Двумерный массив не совпадает с массивом указателей .

Ваш первый оператор создает два массива по шесть символов каждый как один блок памяти .Замените это утверждение на:

char (*array)[6] = new char [2][6];

, и вы будете готовы ко второму утверждению.Не забудьте

delete [] array;

Редактировать 0:

Да, я должен был знать :) На ваш вопрос в комментарии:

Как следуетВпоследствии я передаю массив функции, которая принимает char** в качестве параметра?

Вы этого не делаете.Не в этой форме.Если вы создаете список параметров для некоторого C API, например execve(2), вам придется пройти весь путь с двухэтапной инициализацией:

// prototype of the function to call
void my_fancy_func( int argc, char* const argv[] );

char** my_argv = new char*[my_argc];

for ( i = 0; i < my_argc; i++ ) {
    my_argv[i] = new char[arg_buffer_size];
    snprintf( my_argv[i], arg_buffer_size, "%d", i );
}

my_fancy_func( my_argc, my_argv );
...