2013-03-13 103 views
0

我對某事感到非常困惑。我有一個循環從一個子進程讀取值並將它們插入一個char數組(稱爲sleepTime)。我得到了正確的值(我將它們放入我的char數組後立即在控制檯中顯示),但是當循環讀取下一個值時,數組中的所有內容都會更新爲從管道讀回的當前值。退出循環後,我再次打印結果,數組的每個元素都是最後一次讀取的值。任何人都可以闡明這一點嗎?我很難過。C++數組正在用循環中的當前值覆蓋每個元素

char* sleepTime[4]; 
char randNumSend[15]; 
char randNumRet[15]; 
for (int i=0; i<nWorkers; i++){ // loop to read back values from child process 
    read(pipe2[0],randNumRet,strlen(randNumSend)); // read back data 
    sleepTime[i]=randNumRet; // save values as string for execlp command 
    cout << "sleepTime" << i+1 << ": " << sleepTime[i]<< endl; 
} 

close(pipe2[0]); // close read end of pipe2 

for (int i =0; i<nWorkers; i++){ 
    cout << "sleepTime" << i+1 << ": " << sleepTime[i]<< endl; 
} 
+0

'sleepTime'是如何聲明的? – 2013-03-13 19:23:11

+0

我在我的代碼的頂部添加了sleepTime,randNumSend和randNumRet的變量聲明。 – Erk 2013-03-13 19:36:43

+0

我們可以看到你宣佈的地方** randNumRet **,** randNumSend **和** sleepTime **? – RouteMapper 2013-03-13 19:23:49

回答

0

char* sleepTime[4];是一個指針數組。

如果你寫給sleepTime[i]你正在寫未分配內存。這是一個錯誤。

要分配可以遍歷陣列,並且做到:

sleepTime[i] = malloc(sizeof(char) * length_of_string); 

那麼不要忘記,以避免泄漏到做同樣的free(sleepTime[i]);

在C++中使用std::string代替。

用法:

std::string foo = "blah blah"; 

std::string bar; 

bar = "blah blah"; 
+0

後來在代碼中,我正在運行一個execlp()命令,其中的sleepTime元素爲args。它一直給我錯誤,直到我把數組作爲char *。我認爲這裏有一些基本的東西,我錯過了。我對C++很陌生。 – Erk 2013-03-13 19:31:45

+0

'exceclp(const char *)'需要一個'const char *',如果你沒有,則傳遞變量'char f ='a'的地址; exceclp(&a);',但看到你有一個指針數組,你可以做'exceclp(sleepTime [i]);' – 2013-03-13 19:33:40

+0

我不知道如何使用std :: string – Erk 2013-03-13 19:42:01

0

中的睡眠時間都指向相同的數組值。我建議嘗試sleeptime [4] [15]並用sleeptime [i]替換randNumRet(在讀取函數中)

+0

工作。非常感謝!這樣做更有意義。 – Erk 2013-03-13 19:56:55

相關問題