[英]C sprintf causing a segmentation fault
我试图将参数传递给应该为每对参数创建子进程的父文件。 子进程将每一对加起来,并将它们的总和返回给父进程。 如果传入的参数个数为奇数,则在argv数组的末尾添加一个0,以使其为偶数。 这种情况一直持续到所有参数都加起来,并在最后打印出它们的总和。
一切工作正常,除非我传入了偶数个参数。 子进程将成功添加前两个参数并返回它们,但是当父进程执行sprintf
时(第58行),始终会出现segmentation fault
。
这是父进程和子进程的代码(我使用的是pastebin,因此在这里看起来不太混乱。它们将在一天后过期,因此如果需要,我可以重新发布它们):
编译第二个文件时,第二个文件必须称为worker
,以便由第一个文件运行。 我在Ubuntu 9.10
上使用gcc
以下是一些有关如何运行程序的示例:
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
。
任何帮助将不胜感激!
覆盖参数列表充其量是严重的变态,而最坏的情况是可以保证的故障。 那就是您在sprintf调用中所做的事情-您传递的第一个参数是传递给main()的字符串之一。 你为什么要这么做?
[编辑]我看到您甚至对此发表了评论。 好吧,我不知道您这样做时会发生什么。 如果您解释自己的想法,那么有人也许可以解释您在哪里感到困惑。 您不能向“ argv”数组添加新内容。 这个不成立。 那是系统在启动进程时分配的,您基本上应该将其视为只读(除非您真的知道自己在做什么)。
C标准允许修改argv
指向的字符串:
参数
argc
和argv
以及argv
数组所指向的字符串应可由程序修改,并在程序启动和程序终止之间保留其最后存储的值。
但这并不能保证您写完argv
可用的参数数量,这是将和存储在argv
末尾时要做的。
您似乎正在将argv[i]
用于char *
变量。 为什么不仅仅为了存储总和而声明单独的变量? 如果要求和的数字数为奇数,则也不需要在argv[argc-1]
存储"0"
—您可以轻松地在循环中确定该值,然后将"0"
传递给最后一个工作程序。
argc++;
sprintf(argv[argc-1],"%d",tmp);
您将离开这里的数组边界。 顺便说一句,写argv有什么用?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.