C sprintf导致分段错误

时间:2010-03-04 18:50:36

标签: c process segmentation-fault parent printf

我试图将参数传递给一个父文件,该文件应该为每对参数创建一个子进程。子进程将添加每对并将其总和返回到父进程。如果传入奇数个参数,我会在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

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:3)

覆盖参数列表充其量是一种严重的变态,最坏的情况是保证故障。这就是你在sprintf调用中所做的事情 - 传递它的第一个参数是传递给main()的字符串之一。你为什么这样做?

[编辑]我看到你甚至对此有评论。好吧,我不知道你认为这样做会发生什么;如果你解释你的想法,那么有人可能会解释你在哪里感到困惑。您无法向“argv”数组添加新内容。这没有道理。这是系统在启动您的过程时分配的内容,您基本上应该将其视为只读(除非您真的知道自己在做什么)。

答案 1 :(得分:2)

C标准允许用户修改argv指向的字符串:

  

参数argcargv以及argv数组指向的字符串应该可由程序修改,并在程序启动和程序终止之间保留它们最后存储的值。

但它不能保证你写出argv中可用的参数数量,这就是你在argv末尾存储总和时所做的事情。

您似乎将argv[i]用于char *个变量。为什么不仅仅为了存储总和而声明单独的变量?如果总和的数字是奇数,您也不需要在"0"中存储argv[argc-1] - 您可以在循环中轻松确定,并将"0"传递给最后一个工作人员。

答案 2 :(得分:0)

        argc++;
        sprintf(argv[argc-1],"%d",tmp);

你在这里摆脱了数组边界。顺便说一句,有什么用于写入argv?