c - 访问通过 execlp 传递的数组时出现问题

标签 c arrays fork exec argv

我在通过 exec 传递数组时遇到问题。我似乎只能在传递第一个元素后才能获得它。我知道指针只指向头部,但其余部分应该位于连续内存中。

//runner
int nums[10];
int* nums1=malloc(10*sizeof(int));
nums1=nums;//I know it's redundant
...
execlp("mean","mean",nums1,(char *)NULL);

//Mean.c main
int nums[10];
*nums=argv[1][0];

程序的其余部分在 for 循环中对 nums 的值求和,然后除以 10 得到平均值。

当我尝试遍历数字时,这给了我正确的第一个元素的平均值,以及其余的垃圾。我已经尝试了我能想到的一切(*nums+i,nums[i]),但无法找出导致错误的原因。运行者 nums 已正确填充,但无论我在通过后如何尝试访问数组,我只能得到我确定的 argv[1][i] ,并且 i=0 之后的所有内容都是未定义的。即

10 0 4196061 0 0 0 0 0 4195984 0

对比

10 3 5 6 33 23 2 3 3 4

最佳答案

Olafcomment 中指出,您只能将字符串数组传递给另一个程序。

此外,与 execlp() ,在编译启动程序时必须知道数组的大小;可以通过 execlp() 传递的参数数量是固定的。如果您想要传递未知或可变数量的参数,则必须使用 execvp()。这需要一个以空结尾的字符串指针数组。

在上下文中,这可能意味着:

int num_values = 10;
int nums[10] = { …appropriate initialization… };

char **argv = malloc((num_values + 2) * sizeof(*argv));
if (argv != 0)
    …report error…abandon ship…

argv[0] = "means";
for (int i = 0; i < num_values; i++)
{
    argv[i+1] = malloc(20);   // Big enough for 64-bit signed integer
    if (argv[i+1] == 0)
        …report error…maybe free memory…abandon ship…
    snprintf(argv[i+1], 20, "%d", nums[i]);
}
argv[num_values+1] = NULL;
execvp(argv[0], argv);
…report error…abandon ship…

“放弃船舶”进程可能是一个 exit(EXIT_FAILURE); 或类似的操作 - 通常,您已经 fork 了一个子进程来运行其他程序,并且子进程没有任何操作如果失败了就做。如果您没有 fork 并且要返回到其他代码,那么您需要在从函数返回之前清理分配的内存。

还要注意,执行的程序必须在处理结果之前将字符串转换回整数。

关于c - 访问通过 execlp 传递的数组时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39800990/

相关文章:

c++ - 如何测试 gcc 编译器支持的本地语言(除了英语,如中文、印地语等)

c - LuaJIT FFI : Uploading Steamworks leaderboards

c - C如何计算混合的int和float数据类型

c++ - fork 和传递套接字 c++

c# - 如何制作可在 C# 应用程序中使用的 CUDA dll?

arrays - 使用匿名函数而不是循环来对元胞数组中的值求和

java - 数组 If 语句问题

java - 此处不允许使用数组初始值设定项

从子进程派生后的gdb分离-禁用?

linux - 如何 fork 并保留我需要的进程数量?