我试图将参数传递给一个父文件,该文件应该为每对参数创建一个子进程。子进程将添加每对并将其总和返回到父进程。如果传入奇数个参数,我会在argv数组的末尾添加一个0以使其均匀。这种情况一直持续到所有参数都已加起来,并且它们的总和在最后打印出来。
除非我传递了大量的论据,否则一切都很好。子进程将成功添加前两个参数并返回它们,但是当父进程sprintf
时,(第58行)总是有一个segmentation fault
。
以下是父进程和子进程的代码(我使用的是pastebin,因此它看起来不会很混乱。它们将在一天后到期,所以如果需要我可以重新发布它们):
第二个文件在编译时必须调用worker
才能由第一个文件运行。我在gcc
Ubuntu 9.10
以下是有关如何运行程序的几个示例:
gcc -o parent parent.c
gcc -o worker worker.c
./parent 1 2 3 4
(上面的示例将以segmentation fault
结尾,就像我上面解释的那样)。答案应为10
,因为(1 + 2) + (3 + 4) = 10
。
下面这个可以正常工作,但传入奇数个参数:
./parent 1 2 3
这个问题的答案应该是6
。
非常感谢任何帮助!
答案 0 :(得分:3)
覆盖参数列表充其量是一种严重的变态,最坏的情况是保证故障。这就是你在sprintf调用中所做的事情 - 传递它的第一个参数是传递给main()的字符串之一。你为什么这样做?
[编辑]我看到你甚至对此有评论。好吧,我不知道你认为这样做会发生什么;如果你解释你的想法,那么有人可能会解释你在哪里感到困惑。您无法向“argv”数组添加新内容。这没有道理。这是系统在启动您的过程时分配的内容,您基本上应该将其视为只读(除非您真的知道自己在做什么)。
答案 1 :(得分:2)
C标准允许用户修改argv
指向的字符串:
参数
argc
和argv
以及argv
数组指向的字符串应该可由程序修改,并在程序启动和程序终止之间保留它们最后存储的值。
但它不能保证你写出argv
中可用的参数数量,这就是你在argv
末尾存储总和时所做的事情。
您似乎将argv[i]
用于char *
个变量。为什么不仅仅为了存储总和而声明单独的变量?如果总和的数字是奇数,您也不需要在"0"
中存储argv[argc-1]
- 您可以在循环中轻松确定,并将"0"
传递给最后一个工作人员。
答案 2 :(得分:0)
argc++;
sprintf(argv[argc-1],"%d",tmp);
你在这里摆脱了数组边界。顺便说一句,有什么用于写入argv?