2013-03-13 102 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

相关问题