2014-09-26 4 views
0

Как это сделать? Я получаю ошибку сегментации.Передача многомерного массива в функцию принятия char * []

void pass_array(char* arr[]) 
{ 
    cout << arr[0] << " " << arr[1] << "\n"; 
} 

int main() 
{ 
    #define NUM_ELEMENTS 10 
    #define CHAR_LEN 32 
    char arr[NUM_ELEMENTS][CHAR_LEN]; 
    cin >> arr[0]; 
    cin >> arr[1]; 
    cout << arr[0] << " " << arr[1] << "\n"; 
    pass_array((char**) arr); 
} 

Я хочу сделать это без динамической памяти. Является ли это возможным?

Я знаю, сколько элементов есть в arr, но подпись функции не должна меняться.

+1

Рассматривали ли вы с помощью [ 'станд :: array'] (http://en.cppreference.com/w/cpp/container/array) вместо обнаженных массивов? –

+0

Что происходит, когда вы компилируете и запускаете этот код? –

+0

@ Ошибка кода сегментации. – user4081530

ответ

2

Это невозможно. Массивы и указатели разные. Строка char arr[NUM_ELEMENTS][CHAR_LEN]; определяет непрерывный блок символов; однако функция ожидает список указателей. В arr нет указателей.

При компиляции этого кода вы должны получить ошибки компилятора. Использование броска для подавления ошибок сообщает компилятору «Ssh, я знаю, что я делаю». Однако вы не знаете, что делаете.

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

char *ptrs[NUM_ELEMENTS]; 

for (size_t i = 0; i != NUM_ELEMENTS; ++i) 
    ptrs[i] = arr[i]; 

pass_array(ptrs); 
0

Вам нужно будет сделать что-то вроде следующего источника.

void pass_array(char* arr[]) 
{ 
    std::cout << arr[0] << " " << arr[1] << "\n"; 
} 

int main(int argc, _TCHAR* argv[]) 
{ 
    #define NUM_ELEMENTS 10 
    #define CHAR_LEN 32 
    char arr[NUM_ELEMENTS][CHAR_LEN]; 
    char *arr2[NUM_ELEMENTS]; 

    std::cin >> arr[0]; std::cin.ignore(); // read the first string, discarding CR 
    std::cin >> arr[1];      // read the second string 
    std::cout << arr[0] << " " << arr[1] << "\n"; 
    arr2[0] = arr[0]; // put address of first string into your argument array 
    arr2[1] = arr[1]; // put address of second string into your argument array 
    pass_array(arr2); 
} 
0

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

Альтернативный синтаксис для матрицы

char arr[number_of_rows][number_of_colums] 

является

char (*arr)[number_of_columns] 

В качестве простого примера предварительно инициализируется массив указателей:

char *arr[5] = {"one", "two", "three", "four", "five"}; 
0

Если вы готовы используйте C++ 11 или более новые версии, это должно работать, std :: массивы более предпочтительны, чем c массивы.

#include <array> 
#include <string> 
#include <iostream> 

constexpr auto numElements = 10; 

auto passArray(std::array<std::string, numElements> arr) -> void 
{ 
    std::cout << arr[0] << " " << arr[1] << std::endl; 
} 

auto main() -> int 
{ 
    std::array<std::string, numElements> arr; 
    std::cin >> arr[0]; 
    std::cin >> arr[1]; 
    std::cout << arr[0] << " " << arr[1] << std::endl; 
    passArray(arr); 
    return 0; 
} 
Смежные вопросы