簡體   English   中英

C中出現奇怪的sprintf錯誤

[英]Strange sprintf error in C

我正在調用一個函數,它將為我分支並執行另一個進程的代碼。 有多個進程,標記為B,C和D.我有幾乎相同的代碼用於創建不同的進程。 由於某些奇怪的原因我無法發現,其中一個進程創建函數會導致分段錯誤。 他們看起來和我一模一樣。 任何人都有可能權衡,也許能讓我對這個問題有所了解嗎?

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給了我麻煩,而且...我的手給了上帝...我沒有改變一件事,它開始工作了。 我幾乎想知道這是否可能依賴於環境?

argv[0]是一個未定義的指針,指向sprintf時沒有分配的存儲空間。

當它完全奏效的時候,它是偶然的,你所潦草的記憶正好發生在你的過程空間里。

argvauto聲明為兩個char *指針分配空間。 指針可能充滿了垃圾(也就是說,它們指向隨機位置)並且沒有分配空間來存儲它們中的字符。

你需要類似的東西

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

最后一行對execv來說很重要

你很幸運,其中一個功能確實有效。 您正在做的是兩種情況下的未定義行為,因為您沒有為要打印的字符串分配內存。

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

你的argv[0]argv[1] char指針需要指向某些東西並進行初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM