gpt4 book ai didi

c - 使用 execve 时传递整数参数

转载 作者:太空宇宙 更新时间:2023-11-04 01:42:13 25 4
gpt4 key购买 nike

我是使用 C 系统调用进行编程的初学者。我正在尝试在我的一个程序中使用 execve 调用。我必须将一个整数作为参数传递给通过 execve 调用的程序。但是,在 Internet 上阅读并查看示例代码后,我发现我们只能将字符串作为参数传递。因此,我尝试使用“sprintf”将整数转换为字符串,然后使用“strcpy”将该字符串复制到必须通过 execve 传递的字符串数组的元素之一。但是使用 strcpy 会导致段错误。我通过调试检查了这一点,如果我不使用 strcpy 而只是写一些类似的东西 -myargv[1]="123";然后整个程序工作正常。但是因为我必须传递一个变量整数作为参数而不是常量,所以我不能使用上面的方法。

这个问题困扰了我一段时间。请帮我看看我应该做什么。

最佳答案

这几乎可以肯定是因为您没有为您的字符串分配空间。

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;

关于c - 使用 execve 时传递整数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3446257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com