c++ - 在 argv[] 开头添加参数

标签 c++ linux

if( PIN_Init(argc,argv) || !KnobMaxThreads.Value() )
    {
        return Usage();
    }

要在末尾添加另一个参数,我可以这样做 (argc-1,argv)

if( PIN_Init(argc-1,argv) || !KnobMaxThreads.Value() )
{
    return Usage();
}

如何在 beginning 而不是 end 处添加参数? 我这样使用它:argv[argc-1]

尝试过:

GLOBALFUN int main(int argc, char *argv[])
{
    extern KNOB<UINT32> KnobMaxThreads;
    PIN_InitSymbols();
    if( PIN_Init(argc-1,argv) || !KnobMaxThreads.Value() )
    {
        return Usage();
    }
    int array_size = sizeof(argv)/sizeof(argv[0])
    cout<<"size : "<<array_size<<endl;
    for(int j=array_size -1;j>0;j++)
    {
     argv[j] = argv[j - 1];
    }
    char path[3000] = "";
    cout<<"path : "<<argv[0]<<endl;
    getchar();
    sprintf(path, "%s", argv[argc-1]);

最佳答案

你的代码中有很多废话,你对你试图实现的目标的解释不是很清楚。

1) 你写道“要在末尾添加另一个参数,我可以做 (argc-1,argv)”。这似乎是错误的,例如,如果 argv 包含 10 个元素,您是说它只包含 9 个。我没看到您最后在哪里添加任何内容?因此,当您调用“PIN_Init(argc-1,argv)”时,PIN_Init 函数知道它有一个包含 9 个元素的数组(即使实际上有 10 个元素)。它只能对从 0 到 8 的元素进行操作,跳过最后一个

2) 正如其他人所说,您不能轻易地在数组的前面添加一个元素。您的代码在很多方面都特别错误:

int array_size = sizeof(argv)/sizeof(argv[0])

这是一个常量,不依赖于argv的内容。基本上两个 sizeof 都返回指针的大小(在 32 位架构上通常为 4,在 64 位架构上通常为 8,但在这里无关紧要)因此计算总是产生 1。 如果你想在 array_size 中获取数组中元素的数量,只需使用 argc。

for(int j=array_size -1;j>0;j++)

这将永远不会循环:array_size 始终为 1,j 从 0 开始,条件永远不会满足。这很好,因为如果它开始迭代,它在进入未定义行为(有符号整数溢出)之前永远不会停止。

既然你标记了 C++,最好的方法肯定是使用 std::vector:

std::vector<char *> newArray(argc+1); // vector containing one element more than required
newArray[0] = "my new element at the begining";
for(int arg = 0; arg < argc; ++arg)
    newArray[arg+1] = argv[arg];
// Can safely replace the loop with:
// memcpy(&newArray[1], argv, argc*sizeof(argv[0]));

纯 C 代码需要显式动态内存分配:

char **newArray = (char **)malloc((argc+1)*sizeof(argv[0]);
// Exactly same as before
newArray[0] = "my new element at the begining";
for(int arg = 0; arg < argc; ++arg)
    newArray[arg+1] = argv[arg];
// Can safely replace the loop with:
// memcpy(&newArray[1], argv, argc*sizeof(argv[0]));

// Don't forget to call: free(newArray)

关于c++ - 在 argv[] 开头添加参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22651517/

相关文章:

c++ - x64 位的 C++/CLI DLL 和 Exe 应用程序崩溃

java - Android NDK - 如何从点击获取坐标并将它们显示在 TextView 上?

c++ - 如何向管道写入更多值并读取它们?

Linux 控制台 : git command not found on x64 Cent OS

c++ - Win32 控制台代码在哪里运行?从多个线程使用时控制台挂起

c++ - 获取时间作为文件名

java - 检查与服务器的 TCP 连接数

c++ - Linux 中的套接字——我怎么知道客户端已经完成?

c - 有没有办法在运行时间方面优化这个C程序

c++ - std::accumulate() 只是复数 std::vector 的实部