接受integer主参数,然后使用它们来声明一个数组,问题是constantness

Accepting integer main arguments then using them to declare an array, issue with constantness?

本文关键字:一个 问题是 数组 声明 constantness 参数 integer 然后 接受      更新时间:2023-10-16

我的main接受命令行参数(碰巧都是int),然后我需要用它在堆栈上创建一个数组。

int main(int ragc, char *argv[]) {

互联网让人觉得约定是char*,因为我的命令行参数只会是整数,所以可以接受int*吗?

其次,我需要使用以下两个参数来声明:

 char databuf[nbufs][bufsize]; // where nbufs * bufsize = 1500

但是编译器对我大喊nbufs和bufsize需要有一个常数值。不幸的是,它们必须是int,我接受它们作为命令行参数,那么它们怎么会是常数值呢?

int main(int ragc, char *argv[]) {
    int nbufs = atoi(argv[3]); //grabs the nbufs
    int bufsize = atoi(argv[4]); //grabs the bufsize
    char databuf[nbufs][bufsize]; //where nbufs * bufsize = 1500

如果main有参数,那么第二个参数需要是char*s(或const char*s)的数组。规范中就是这样定义的。直观地说,不能保证命令行参数必须是整数;有人可以用文本参数运行你的程序,但不清楚报告错误的是谁的工作(操作系统还是你的程序)?

其次,在C++中,不能声明维度为非常量的数组。C允许你这样做(它们被称为可变长度数组),在C++1y(C++的下一个版本)中,这可能会得到支持,但目前你不能在C++中做到这一点。要解决此问题,请使用std::vector秒的std::vector,如下所示:

std::vector<std::vector<char>> databufs(nbufs, std::vector<char>(bufsize));

希望这能有所帮助!

因为我的命令行参数只能是整数,所以可以接受int*吗?

不,这是不可能的:标准规定单个参数为char*。你对atoi的使用对你所做的完全有效。

它们必须是int,我接受它们作为命令行参数,那么它们怎么会是常数值呢?

它们不能是常数值,因此需要使用动态分配。由于这是C++,所以更好的选择是字符串的向量;然而,char**也是可能的:

char **dataBuf = new char*[nbufs];
for (int i = 0; i != nbufs ; i++) {
    dataBuf[i] = new char[bufsize];
}
// Use dataBuf here
...
// Now free its memory
for (int i = 0; i != nbufs ; i++) {
    delete[] dataBuf[i];
}
delete[] dataBuf;

注:C99允许使用可变大小的阵列;g++也允许这些作为扩展。但是,您应该小心使用扩展,因为它们会降低程序的可移植性。

它必须是char*,因为char*可以表示任何可能的值,但如果是int/int*,则输入范围仅限于数字。我相信这就是为什么标准选择使用char*来定义它。