簡體   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