传递多维数组以接受char * []

时间:2014-09-26 00:25:28

标签: c++ arrays multidimensional-array

我该怎么做?我遇到了分段错误。

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中有多少元素,但函数签名不能改变。

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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);
}

答案 2 :(得分:0)

目前尚不清楚是否要传递真正的多维数组(如矩阵),或者是否要传递指针数组。

矩阵的替代语法

char arr[number_of_rows][number_of_colums]

char (*arr)[number_of_columns]

作为预先初始化的指针数组的一个简单示例:

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

答案 3 :(得分:0)

如果您愿意使用C ++ 11或更新版本,这应该可行,std :: arrays比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;
}