动态设置数组大小C ++

时间:2014-03-18 21:03:10

标签: c++

我根本不知道任何C ++,但我正在尝试对我的应用程序正在使用的C ++库进行非常小的更新。在我开始对此进行攻击之前,我希望有人可以告诉我以下内容的正确语法:

我有以下几行代码:

#define A_NUMBER 100
#define ANOTHER_NUMBER 150

enum {
   type1,
   type2,
 };

static int someMethod(int type)

{
     char command[A_NUMBER];
     //...more code
}

我需要做的是基于类型参数(type1或type2)我需要能够将数组的大小设置为A_NUMBER或ANOTHER_NUMBER。

在伪代码中,它将类似于:

if (type == type1) {
    char command [A_NUMBER]
}
else if (type == type2) {
    char command [ANOTHER_NUMBER]
} 

有没有办法动态定义大小?

3 个答案:

答案 0 :(得分:5)

是的,您可以使用std::vector<char>

if (type == type1) {
    std::vector<char> x(A_NUMBER);
} else if (type == type2) {
    std::vector<char> x(ANOTHER_NUMBER);
} 

请记住将标题包含在:

#include <vector>

  

虽然您的示例代码与&#34;伪代码匹配&#34;在这个问题中,我认为问题的一部分是如何通过类型决定大小,然后无条件地使用结果存储,即在条件块之外。

然后它变得如此简单:

std::vector<char> x;
if (type == type1) {
    x.resize(A_NUMBER);
} else if (type == type2) {
    x.resize(ANOTHER_NUMBER);
} 

答案 1 :(得分:0)

是和否。在标准C ++中,您无法将数组保留在堆栈中并且在运行时确定其大小。

但是,您可以将数组转换为动态分配的数组(即在堆上)。在C ++中,执行此操作的标准方法是使用std::vector

std::vector<char> command(A_NUMBER); // or ANOTHER_NUMBER

索引与以前一样有效:command[5]

但是,如果你需要将数组传递给需要C风格数组的东西(即char *),你必须使用其中一个:

command.data();  // if your compiler supports C++11

&command[0];  // if it does not

当然,要使用std::vector,您必须#include <vector>

答案 2 :(得分:0)

这是一个适用于C和C ++的例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main(int argc, char *argv[])
{
    char *opt;
    if(argc == 2) {
        opt = *++argv;
    }
    else {
        printf("Usage: %s [small|large]\n", *argv);
        return EXIT_FAILURE;
    }

    int *arr;
    int arrlen = 0;
    if (strcmp(opt, "small") == 0) {
        arrlen = 3;
        arr = (int *) malloc(arrlen*sizeof(int));
        int i;
        for(i = 0; i < arrlen; i++)
            arr[i] = i+1; 
    }
    else if (strcmp(opt, "large") == 0) {
        arrlen = 5;
        arr = (int *) malloc(arrlen*sizeof(int));
        int i;
        for(i = 0; i < arrlen; i++)
            arr[i] = i+1; 
    }
    if (arrlen > 0) {
        int i;
        for(i = 0; arr[i]; i++)
            printf("%i, ", arr[i]);
        printf("\n");
        free(arr);
    }
    return EXIT_SUCCESS;
}

示例:

[gyeh@gyeh stackoverflow]$ ./dynarr
Usage: ./dynarr [small|large]
[gyeh@gyeh stackoverflow]$ ./dynarr small
1, 2, 3, 
[gyeh@gyeh stackoverflow]$ ./dynarr large
1, 2, 3, 4, 5,