2011-12-02 56 views
0

我有這樣一個有趣的問題,我想我會分享給你。魔法C與malloc,叉子和開放

我走投無路下來的最小程序,我可以:

#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 

int cmd_left(char *name) 
{ 
    pid_t pid; 
    int f_d; 

    if ((pid = fork()) == -1) 
    { 
     perror(""); 
     exit(1); 
    } 
    f_d = open(name); 
    printf("%d\n", f_d); 
    close(f_d); 
} 

int main(int ac, char **av, char **env) 
{ 
    char **dummy_env; 

    if (ac < 2) 
    return (0); 
    dummy_env = malloc(10); 
    cmd_left(av[1]); 
} 

基本上,如果我刪除的malloc,開放的工作就好了。 你只需編譯並給程序一個(有效)文件來看看這個魔法。

+1

你不是指'malloc(10 * sizeof(char *))'? – Joe

+0

不,我只想要最小的東西 –

+0

也請多謝:) –

回答

2

你需要#include <fcntl.h>以獲取範圍open()的聲明,然後會告訴你,你是不是有足夠的參數調用它:

int open(const char *filename, int flags, ...); 

(可選參數 - 奇 - 是的權限文件(mode_t perms)如果你有O_CREAT躋身於flags參數的選項。)

的呼叫malloc()塗鴉了足夠的堆棧以首先除去它的零,這讓「額外的參數」到open()處於不是零的狀態,並且遇到問題。

未定義的行爲 - 您正在調用 - 可能導致任何奇怪的結果。

確保您編譯時至少有'gcc -Wall',我建議'gcc -Wmissing-prototypes -Wstrict-prototypes -Wall -Wextra'。

+0

+1,這些都是非常好的C警告。 – ninjalj

4

open(2)至少需要兩個參數。由於您只傳遞一個參數,因此您正在調用未定義的行爲。在這種情況下,open()只是使用一些垃圾作爲第二個參數。

+0

是的,就是這樣,問題解決了抱歉的傢伙 –

+0

不知道如何標記爲已解決,感謝ninjalj無論如何:) –

+0

@ user1078262:單擊答案當前得分下面的複選標記形狀。當你這樣做時,它會變成綠色,表明你已經接受了答案。 –

1

open的頭文件丟失,打開期望至少有第二個參數。

如果你確定它應該沒問題。