繁体   English   中英

C sprintf导致分段错误

[英]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指向的字符串:

参数argcargv以及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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM