C++ 传递函数中常量int的值以初始化数组
我知道数组需要有一个常量int才能初始化,所以我在main中有这个。我希望这主要是因为我想能够修改这些数字容易,如果必要的话C++ 传递函数中常量int的值以初始化数组,c++,arrays,C++,Arrays,我知道数组需要有一个常量int才能初始化,所以我在main中有这个。我希望这主要是因为我想能够修改这些数字容易,如果必要的话 const int magicWordCount = 10; compareWords(magicWordCount); 此函数的声明是: void compareWords(const int); 定义: void Words::compareWords(const int magicWordCount) { std::string magic[magicWordC
const int magicWordCount = 10;
compareWords(magicWordCount);
此函数的声明是:
void compareWords(const int);
定义:
void Words::compareWords(const int magicWordCount)
{
std::string magic[magicWordCount] = {};
convertToStringArray(magicBuffer, magicBufferLength);
}
当我这样做时,intellisense告诉我,定义中的“magicWordCount”必须有一个常量值。我搞不清楚这个值在哪里不是常数。想法?虽然
magicWordCount
是const
,但据编译器所知,它是一个运行时常量,而不是编译时常量。换句话说,它可以确保magicWordCount
的值不会在words::compareWords
中更改
这还不足以声明具有特定大小的数组:编译器(和intellisense)要求一个编译时常量magicWordCount
不是编译时常量
通过使用std::vector
而不是数组,可以避免此问题:
std::vector<std::string> magic(magicWordCount);
std::向量魔法(magicWordCount);
尽管
magicWordCount
是const
,但就编译器所知,它是一个运行时常量,而不是编译时常量。换句话说,它可以确保magicWordCount
的值不会在words::compareWords
中更改
这还不足以声明具有特定大小的数组:编译器(和intellisense)要求一个编译时常量magicWordCount
不是编译时常量
通过使用std::vector
而不是数组,可以避免此问题:
std::vector<std::string> magic(magicWordCount);
std::向量魔法(magicWordCount);
即使没有
const
也可以使用上述方法。您可以将magicWordCount放在Word类标题中,位于类定义之上。它在那里仍然很容易访问,您不必再将其作为函数参数传入。您可以将magicWordCount放在Word类标题中,在类的定义之上。它在那里仍然很容易访问,并且您不再需要将其作为函数参数传递。这是关于数组的问题
因为数组存储在本地范围内
这意味着如果它没有常量大小(在编译之前定义),它可能会发起缓冲区溢出攻击
例如,常量int magicWordCount=1000
字符串[]的大小将完全覆盖返回点
所以在这种情况下,您可以使用指针代替
string* str = (string*)malloc(sizeof(string*) * a);
for(int i = 0; i < a; i++){str[i] = "";}
string*str=(string*)malloc(sizeof(string*)*a);
对于(inti=0;i
我认为,永远不要使用数组,而是使用指针
因为数组的性能非常差,读/写逻辑也很奇怪,这就是数组的问题 因为数组存储在本地范围内 这意味着如果它没有常量大小(在编译之前定义),它可能会发起缓冲区溢出攻击 例如,常量int magicWordCount=1000 字符串[]的大小将完全覆盖返回点 所以在这种情况下,您可以使用指针代替
string* str = (string*)malloc(sizeof(string*) * a);
for(int i = 0; i < a; i++){str[i] = "";}
string*str=(string*)malloc(sizeof(string*)*a);
对于(inti=0;i
我认为,永远不要使用数组,而是使用指针
因为数组的性能很差,读/写逻辑也很奇怪,所以不允许使用vector。这是一份作业。我不需要这样做作业,我只是认为将常量放在main中可以轻松访问是一个很好的特性;但我还是犯了同样的错误。我不熟悉编译时常量:(您不能传入一个值并使其成为编译时常量。对函数的一次调用可以使用10和另一次调用100,从而在运行时更改
magicWordCount
的值。那么如何传递一个值来初始化数组?或者这不是一个好的做法?如果您不能使用向量,唯一的可移植解决方案是new[]
和delete[]
一个数组。std::string*magic=new string[magicWordCount];
这需要大量内存管理,因为您必须delete[]magic;
当你完成它的时候。如果抛出异常或者你的函数中有多个退出点,这可能会很棘手。这里的更多信息:我们不允许使用vector。这是一个赋值。我不需要这样做赋值,我只是认为让putti轻松访问const是一个很好的特性我尝试使用:constexpr int magicWordCount=10来声明magicWordCount;但仍然出现相同的错误。我不熟悉编译时常量:(您不能传入一个值并使其成为编译时常量。对函数的一次调用可以使用10和另一次调用100,从而在运行时更改magicWordCount
的值。那么如何传递一个值来初始化数组?或者这不是一个好的做法?如果您不能使用向量,唯一的可移植解决方案是new[]
和delete[]
一个数组。std::string*magic=new string[magicWordCount];
这需要大量内存管理,因为您必须delete[]magic;
完成后。如果抛出异常或函数中有多个退出点,这可能会很棘手。这里的更多信息:magicWordCount不是常量,而是参数(或变量)使用const access意味着它可以在每次调用函数时使用不同的数字,但不会在函数中更改。在运行时创建数组的标准方法是使用std::vector(如果要调整大小)或std::