【问题标题】:Trouble accessing an array passed through execlp无法访问通过 execlp 传递的数组
【发布时间】:2016-09-30 22:31:53
【问题描述】:

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

【问题讨论】:

  • 您的//I know it's redundant 行实际上比多余的更糟糕。它会泄漏内存,因为您没有 free 之前的 malloc !另外,我不明白您为什么要定义 nums1,而您显然只是将它用作 nums 的额外名称。
  • execlp 是一个带有可变参数的函数,也称为椭圆。您不能将数组扩展为椭圆的多个参数。如果你想在一个数组中包含参数并且你想将数组作为一个整体传递,那么你必须使用execvp。请注意,数组的第 0 个元素是作为 argv[0] 传递的(在大多数情况下与路径相同),并且数组的最后一个元素必须为 NULL。
  • 参数也应该是C字符串!仅仅因为您没有收到编译器警告(由于可变参数函数)并不意味着您的代码是正确的。阅读您使用的功能的手册页!也许您首先想在摆弄流程等之前正确学习基础知识。
  • @Pablo:请保持友善。
  • @alk:我看不出我哪里不“好”,我只是指出糟糕的代码就是垃圾。也许我不应该用废话这个词,我承认。

标签: c arrays fork exec argv


【解决方案1】:

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

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

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

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…

'abandon ship' 进程可能是一个exit(EXIT_FAILURE); 或类似的操作——通常,您已经派生了一个子进程来运行另一个程序,并且如果它失败了,子进程将无事可做。如果你没有 fork 并且你要返回到其他代码,那么你需要在从函数返回之前清理分配的内存。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 2021-10-10
    相关资源
    最近更新 更多