Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问通过execlp传递的数组时出现问题_C_Arrays_Fork_Exec_Argv - Fatal编程技术网

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

访问通过execlp传递的数组时出现问题,c,arrays,fork,exec,argv,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]; 程序的其余

我无法通过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
正如在中指出的,您只能将字符串数组传递给另一个程序

此外,在编译启动程序时,必须知道阵列的大小;可以通过
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…
int num_值=10;
int nums[10]={…适当的初始化…};
字符**argv=malloc((num_值+2)*sizeof(*argv));
如果(argv!=0)
…报告错误…弃船…
argv[0]=“意味着”;
对于(int i=0;i
“弃船”过程可能是退出(退出失败)或类似的操作-通常,您已经派生了一个子进程来运行另一个程序,如果它失败了,子进程将无需执行任何操作。如果您没有分叉,并且要返回到其他代码,那么您需要在从函数返回之前清理分配的内存


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

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