【发布时间】: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:我看不出我哪里不“好”,我只是指出糟糕的代码就是垃圾。也许我不应该用废话这个词,我承认。