C导致分段错误的sprintf

C导致分段错误的sprintf,c,process,segmentation-fault,parent,printf,C,Process,Segmentation Fault,Parent,Printf,我试图将参数传递给父文件,该父文件应该为每对参数创建一个子进程。子进程将对每一对进行相加,并将其总和返回给父进程。如果传入的参数数量为奇数,我会在argv数组的末尾添加一个0以使其为偶数。这种情况会一直发生,直到所有的参数都加起来,并且在最后打印出它们的总和 一切都很顺利,除了我提出了偶数的论点。子进程将成功地添加前两个参数并返回它们,但当父进程执行sprintf(第58行)时,始终存在分段错误 以下是父进程和子进程的代码(我使用的是pastebin,所以这里看起来不太凌乱。它们将在一天内过期,

我试图将参数传递给父文件,该父文件应该为每对参数创建一个子进程。子进程将对每一对进行相加,并将其总和返回给父进程。如果传入的参数数量为奇数,我会在argv数组的末尾添加一个0以使其为偶数。这种情况会一直发生,直到所有的参数都加起来,并且在最后打印出它们的总和

一切都很顺利,除了我提出了偶数的论点。子进程将成功地添加前两个参数并返回它们,但当父进程执行
sprintf
(第58行)时,始终存在
分段错误

以下是父进程和子进程的代码(我使用的是pastebin,所以这里看起来不太凌乱。它们将在一天内过期,因此如果需要,我可以重新发布):

第二个文件在编译时必须调用
worker
,以便由第一个文件运行。我在
ubuntu9.10上使用
gcc

以下是一些有关如何运行程序的示例:

gcc -o parent parent.c
gcc -o worker worker.c
./parent 1 2 3 4
(上面的例子将以一个
分段错误
结束,就像我上面解释的那样)。答案应该是
10
,因为
(1+2)+(3+4)=10

尽管传入奇数个参数,但下面这一项仍可以正常工作:

./parent 1 2 3
这个问题的答案应该是
6


任何帮助都将不胜感激

覆盖参数列表充其量是一种严重的扭曲,充其量是一种保证错误。这就是您在sprintf调用中所做的事情—您传递给它的第一个参数是传递给main()的字符串之一。你为什么这么做


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

覆盖参数列表充其量是一种严重的扭曲,充其量是一种保证错误。这就是您在sprintf调用中所做的事情—您传递给它的第一个参数是传递给main()的字符串之一。你为什么这么做

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

您将从这里的数组边界中退出。顺便说一句,写argv有什么用


您将从这里的数组边界中退出。顺便说一句,写入argv有什么用?

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

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

但是它不能保证您在
argv
中写入超过可用数量的参数,这是您在
argv
末尾存储总和时所做的操作


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

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

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

但是它不能保证您在
argv
中写入超过可用数量的参数,这是您在
argv
末尾存储总和时所做的操作


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

您有一个错误。这个bug不在sprintf中,它不仅仅是一个bug;这是对事情如何运作的误解。这个程序似乎正试图做他想做的事情——这就是问题所在:——@Alok:我只是让链接可以点击(因为OP只有1个代表,所以无法点击),希望这能让你的生活更轻松。谢谢你的帮助。当我第一次开始制作这个程序时,出于好奇,我尝试添加到artray中,它似乎起了作用。这就是为什么我尝试更进一步,但我现在意识到我不应该修改argv和argcYou有一个bug。这个bug不在sprintf中,它不仅仅是一个bug;这是对事情如何运作的误解。这个程序似乎正试图做他想做的事情——这就是问题所在:——@Alok:我只是让链接可以点击(因为OP只有1个代表,所以无法点击),希望这能让你的生活更轻松。谢谢你的帮助。当我第一次开始制作这个程序时,出于好奇,我尝试添加到
        argc++;
        sprintf(argv[argc-1],"%d",tmp);