我的程序使用fork启动子进程,以向父进程询问有关UNIX时间的信息。我已经创建了一个具有共享内存的函数,可以将刻度(UNIX-Time)和客户端编号写入具有索引MAXENTRIES的结构数组中。 我无法弄清楚为什么传递给函数f_timeLog(int,int)的值不显示在数组中。
如果我使用
打印 printf("From: %d\tTICKS: %d\n", logSM[*counter]->vonWem, logSM[*counter]->ticks);
值始终表示:0。 如果我调试程序,它将正确写入第一个值logSM [0],但不会正确写入。
感谢帮助!
typedef struct
{
int vonWem;
int ticks;
}timeLog [MAXENTRIES];
void f_timeLog(int who, int ticks)
{
int *counter;
timeLog *logSM;
logSM = (timeLog*) shmat(TimeLog, NULL, (SHM_R|SHM_W));
counter = (int*) shmat(IDCounter, NULL, (SHM_R|SHM_W));
P(SemWriteLog);
logSM[*counter]->vonWem = who;
logSM[*counter]->ticks = ticks;
*counter= *counter+1;
if(*counter >= MAXENTRIES) *counter= *counter - MAXENTRIES;
V(SemWriteLog);
}
输出为logSM [0] vonWem = X,ticks = xxxxxxxx 和logSM [1]以及进一步:vonWem = 0,ticks = 0;
答案 0 :(得分:1)
logSM
是指向数组的指针,而不是指针数组。
由于logSM
是一个指针,我们需要取消引用它。而且因为它指向结构对象(实例)的数组,所以我们不能使用“箭头”运算符。
所以用法应该像
(*logSM)[*counter].ticks = ticks;
更自然的解决方案是将类型别名timeLog
重新定义为结构本身。
类似
typedef struct
{
int vonWem;
int ticks;
} timeLog;
然后,您可以像使用其他任何指针或数组一样使用logSM
:
logSM[*counter].ticks = ticks;