[英]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
時沒有分配的存儲空間。
當它完全奏效的時候,它是偶然的,你所潦草的記憶正好發生在你的過程空間里。
argv
的auto
聲明為兩個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.