使用execve时传递整数参数

我是使用C语言系统调用编程的初学者。我试图在我的一个程序中使用execve调用。 我必须将一个整数作为参数传递给通过execve调用的程序。 但是,在互联网上阅读并查看示例代码,我可以看到我们只能将字符串作为参数传递。 所以,我尝试使用’sprintf’将整数转换为字符串,然后使用’strcpy’将该字符串复制到必须通过execve传递的字符串数组的一个元素中。 但是使用strcpy会导致分段错误。 我通过调试检查了这一点,如果我不使用strcpy但只是写一些像 – myargv [1] =“123”; 然后整个程序工作正常。 但由于我必须传递一个变量整数作为参数而不是常量,我不能使用上面的方法。

这个问题一直困扰着我。 请帮助我解决我应该做的事情。

几乎可以肯定,因为你没有为你的字符串分配空间。

myargv[1]="123"; work是因为你将指针设置为指向已经存在的字符串(编译器通常将“123”放入预先初始化的内存中并且它只是被加载)。 使用类似的东西:

 char *myargv[10]; strcpy (myargv[1], "anything"); 

你通常会遇到问题,因为myargv[1]指针没有分配后备存储。


你可以做的是简单地将myargv[1]直接设置到sprintf -ed字符串的缓冲区:

 char sprintf_buffer[whatever]; sprintf (sprintf_buffer, "%d", myInteger); myargv[1] = sprintf_buffer; 

或者,如果您正在重新使用该缓冲区(以便为多个整数参数覆盖该值),请使用strdup

 char sprintf_buffer[whatever]; sprintf (sprintf_buffer, "%d", myInteger1); myargv[1] = strdup (sprintf_buffer); sprintf (sprintf_buffer, "%d", myInteger2); myargv[2] = strdup (sprintf_buffer); 

如果,由于某种原因,您的平台没有一个strdup ,这里有一个适合您:

 char *strdup (const char *s) { char *d = (char *)(malloc (strlen (s) + 1)); if (d != NULL) strcpy (d,s); return d; } 

请记住,您应该始终检查strdup的返回值,以确保内存分配有效。 我把它留在了这里,因为它与手头的问题无关。


您可以避免使用多个缓冲区分配内存(前提是您需要提前知道缓冲区的绝对数量):

 char sprintf_buffer1[whatever]; char sprintf_buffer2[whatever]; sprintf (sprintf_buffer1, "%d", myInteger1); myargv[1] = sprintf_buffer1; sprintf (sprintf_buffer2, "%d", myInteger2); myargv[2] = sprintf_buffer2; 

我不清楚你为什么要使用strcpy 。 只需将数字snprintf到字符串中,然后创建其中一个参数。

例如

 char numberArgBuffer[20]; // more than big enough for a 32 bit integer snprintf(numberArgBuffer, 20, "%d", numberArg); char* argv[3]; char* envp[1]; argv[0] = exeName; // could be same as path argv[1] = numberArgBuffer; argv[2] = NULL; envp[0] = NULL; int ret = execve(path, argv, envp); // if you get here execve failed, so handle the error 

你的strcpy可能是段错误,因为你没有为目的地分配一个缓冲区,但正如上面的例子所示,无论如何这都是一个不必要的步骤。