我可以给argv分配一个值吗?

4

当我使用VSCode进行C和C++调试时,有时需要一些命令行参数(./runFile args1 args2)。如果我直接点击运行,它会显示argv[2]超出范围。这是因为我没有输入参数。但是,如果我通过命令行输入参数,似乎无法在VSCode中步进调试。我想到的方法是在主函数开头使用argv[]=value来赋值命令行参数。这种使用方式是否有问题?而且,我只能够argv[0]=valueargv[1]=value。是否有一种方法可以直接通过argv=...来分配值给argv?我尝试了argv[1] = 值argv[2] = 值。可以正常操作。这里是否存在任何风险?比如,为argv分配了多少内存?


你不需要给 argv 赋值。看起来你想要在命令行没有提供参数时使用默认值。为此,检查 argc == 1 并使用一些硬编码的默认值。不要给 argv 赋值。 - NicholasM
如果没有传入任何参数,您就不能分配argv[1]。在这种情况下,没有存储空间。您可以这样做:提供存储空间,即分配一个数组char *argv_[] = { argv[0], "arg1", "arg2", nullptr };,然后将argc = 3; argv = argv_; - Scheff's Cat
2个回答

5

我可以给 argv 赋值吗?

可以。

但是另一个问题是你是否应该这样做。我不建议这样做。

例如,为 argv 分配了多少内存?

argv 所指向的数组中保证有 argc + 1 个指针,最后一个是一个空指针。没有保证会分配更多的内存。


附注:我没有使用过 VSCode,但我猜它在运行调试器时肯定有一种指定命令行参数的方法。大多数集成开发环境都有这样的功能。如果没有,那么也许你可以使用命令行调试器。


哦,我忘记了最后的 nullptr。 :-) 请注意,OP 的初始前提是通过命令行传递命令行参数是问题所在。因此,在进入 main() 之前可能没有足够的分配可用。 - Scheff's Cat

5

当vscode运行你的程序时,它会使用在名为launch.json 的文件中找到的参数来运行程序。

如果你转到:运行 -> 打开配置,那么就会打开该项目的launch.json。默认情况下,它看起来像这样:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "enter program name, for example ${workspaceFolder}/a.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

如果你将鼠标悬停在 args 上,它会告诉你:"传递给程序的命令行参数。"

与其在程序启动后尝试修改 argv,不如尝试将你想要的参数放在那里,看看是否像它所说的那样将这些参数传递给你的程序。


谢谢您的回复。这个方法可行。但我不想在每个工作区生成一个 .vscode 文件。我想使用一个 .vscode 文件来配置所有的工作区。那么是否有任何方法可以避免频繁更改 argv。例如,参数是否可以写入文件?或者从控制台输入? - Gerrie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接