我是使用 C 中的系统调用进行编程的初学者。我正在尝试在我的一个程序中使用 execve 调用。我必须将一个整数作为参数传递给通过 execve 调用的程序。然而,在互联网上阅读并查看示例代码,我可以看到我们只能传递字符串作为参数。因此,我尝试使用“sprintf”将整数转换为字符串,然后使用“strcpy”将该字符串复制到必须通过 execve 传递的字符串数组的元素之一中。但使用 strcpy 会导致分段错误。我通过调试检查了这一点,如果我不使用 strcpy 而只是编写类似 - myargv[1]="123"; 的内容,那么整个程序就可以正常运行了。但由于我必须传递一个可变整数作为参数而不是常量,因此我无法使用上述方法。
这个问题已经困扰我一段时间了。请帮我看看我应该做什么。
几乎可以肯定,因为您没有为字符串分配空间。
之所以myargv[1]="123";有效,是因为您将指针设置为指向已经存在的字符串(编译器通常将“123”放入预初始化的内存中,然后它就会被加载)。通过使用类似的东西:
char *myargv[10];
strcpy (myargv[1], "anything");
Run Code Online (Sandbox Code Playgroud)
您通常会遇到问题,因为没有为myargv[1]指针分配后备存储。
您可以做的就是直接设置为您-ed 字符串的myargv[1]缓冲区:sprintf
char sprintf_buffer[whatever];
sprintf (sprintf_buffer, "%d", myInteger);
myargv[1] = sprintf_buffer;
Run Code Online (Sandbox Code Playgroud)
或者,如果您要重复使用该缓冲区(以便该值被多个整数参数覆盖),请使用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);
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因,您的平台没有,这里strdup有一个适合您:
char *strdup (const char *s) {
char *d = (char *)(malloc (strlen (s) + 1));
if (d != NULL)
strcpy (d,s);
return d;
}
Run Code Online (Sandbox Code Playgroud)
请记住,您应该始终检查返回值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;
Run Code Online (Sandbox Code Playgroud)