gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:37:29 24 4
gpt4 key购买 nike

我在通过 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/

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