在 argv[] 的开头添加一个参数

Adding a parameter at beginning of argv[]

本文关键字:一个 参数 添加 argv 开头      更新时间:2023-10-16
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)
#include <iostream>
void print(int c, char* v[]){
  for (int j = 0; j<c; j++)
    {
      std::cout << j;
      std::cout << " " << v[j];
      std::cout << "n"; 
    }
}
int main(int argc, char* argv[])
{
  const char *extra = "My New 1st Param";
  char *newargs[argc+1];
  std::cout << "before n";
  print(argc, argv);
  for(int j = 0; j<argc; j++)
    {
      newargs[j+1] = argv[j];
    }
  newargs[0] = extra;   // warns -- not too fond of this
  std::cout << "after n";
  print(argc+1, newargs);
  return 0;
}

示例输出

$ ./a.out hello
before 
0 ./a.out
1 hello
after 
0 My New 1st Param
1 ./a.out
2 hello