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]);
答案 0 :(得分:3)
您的代码中存在许多无意义的内容,并且您对尝试实现的内容的解释并不十分明确。
1)你写了#34;要在最后添加另一个参数,我可以做(argc-1,argv)&#34;。这似乎是错的,如果argv包含10个元素,例如,你说它只包含9个。我不知道你最后在哪里添加任何东西?因此,当您调用&#34; PIN_Init(argc-1,argv)&#34;时,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)
答案 1 :(得分:2)
#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