2010-08-17 119 views
3

我正在調用一個函數,它將爲我分支並執行另一個進程的代碼。有多個進程,標記爲B,C和D.我具有幾乎相同的代碼來創建不同的進程。由於我無法發現的一些奇怪的原因,過程創建功能之一導致了分段錯誤。他們看起來和我一樣。任何偶然有人可能會感受到的機會,也許能讓我對這個問題有所瞭解?C中的奇怪sprintf錯誤

void spawn_process_b(int fileID[]){ 
    int pid; 
    char * argv[2]; 

    sprintf(argv[0], "%d", fileID[0]); 
    sprintf(argv[1], "%d", fileID[1]); 

    pid = fork(); 

    if (pid == 0) 
    { 
     execv("PipeW1", argv); 
    } 
} 

void spawn_process_c(int fileID[]){ 
    int pid; 
    char * argv[2]; 

    sprintf(argv[0], "%d", fileID[0]); 
    sprintf(argv[1], "%d", fileID[1]); 

    pid = fork(); 

    if (pid == 0) 
    { 
     execv("PipeW2", argv); 
    } 
} 

通過投入斷點與COUT < < 「BP1」 < < ENDL;等等,我發現spawn_process_b將會執行得很好。 spawn_process_c將進入,但在第一個sprintf指令中獲得段錯誤。有人有主意嗎?最初,spawn_process_b給我帶來了麻煩,而且......我的手對上帝......我沒有改變一件事,並開始工作。我幾乎想知道這是否可能依賴於環境?

回答

9

argv[0]是一個未定義的指針,當您將其中的sprintf放入它時,未分配存儲空間。

當它工作的時候,那是偶然的,隨着你潦草地寫在你的進程空間中的內存。

auto聲明argv您爲兩個char *指針分配空間。這些指針可能充滿了垃圾(也就是說,它們指向隨機的位置),並且沒有分配空間來存儲角色。

你需要像

char *argv[3]; 
for (int i = 0; i < 2; i++) 
    argv[i] = malloc(space enough for my integer); 
argv[2] = 0; 

如果最後一行是一種重要的execv

+0

爲什麼它會在spawn_process_b中工作?而且它確實在工作......被調用的附加進程會將結果輸出到屏幕上,以證明它正在獲取值。 – rybosome 2010-08-17 21:04:17

+0

這適用於兩段代碼。 'char * argv [2]'分配兩個指針的數組,但不初始化任何一個指針。 – Thanatos 2010-08-17 21:04:30

+0

@Ryan:你幸運。這是未定義的行爲 - 它可能工作,它可能不會,取決於當前的內存狀態。 – Thanatos 2010-08-17 21:05:11

4

你只是幸運的功能之一實際工作。在這兩種情況下,您所做的都是未定義的行爲,因爲您尚未爲要打印的字符串分配內存。

char *argv[2]只聲明2個字符指針的數組,但它們指向無處。您需要爲他們分配內存,然後你可以使用它們,無論是靜態像這樣:

char argv[2][100]; // 2 strings of 100 characters each 

或動態像這樣:

char *argv[2]; 
int i; 
for (i = 0; i < 2; i++) 
    argv[i] = (char *)malloc(100 * sizeof(char)); // 100 characters 
1

argv[0]argv[1]字符指針需要指向的東西,是初始化。