我是使用C系统调用进行编程的初学者。我正在尝试在我的一个程序中使用execve调用。我必须将一个整数作为参数传递给通过execve调用的程序。 但是,在互联网上阅读并看到示例代码,我可以看到我们只能将字符串作为参数传递。所以,我尝试使用'sprintf'将整数转换为字符串,然后使用'strcpy'将该字符串复制到必须通过execve传递的字符串数组的一个元素中。 但是使用strcpy会导致分段错误。我通过调试检查了这一点,如果我不使用strcpy但只是写一些像 - myargv [1] = “123”; 然后整个程序工作正常。 但由于我必须传递一个变量整数作为参数而不是常量,我不能使用上面的方法。
这个问题一直困扰着我。请帮助我解决我应该做的事情。
答案 0 :(得分:4)
几乎可以肯定,因为你没有为你的字符串分配空间。
myargv[1]="123";
工作的原因是因为您将指针设置为指向已存在的字符串(编译器通常将“123”放入预先初始化的内存中并且只是加载)。通过使用类似的东西:
char *myargv[10];
strcpy (myargv[1], "anything");
你通常会遇到问题,因为myargv[1]
指针没有分配后备存储空间。
您可以做的只是将myargv[1]
直接设置到sprintf
- 字符串的缓冲区:
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;
答案 1 :(得分:0)
我不清楚你为什么要使用strcpy
。只需snprintf
将数字转换为字符串并将其作为参数之一。
e.g。
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
可能是分段错误,因为您没有为目的地分配缓冲区,但正如上面的示例所示,无论如何这都是不必要的步骤。