好吧,首先我将从一些背景开始。
我正在为一个涉及客户端和服务器的类的项目进行开发。它们是两个独立的过程,它们通过我们所谓的请求渠道相互通信。

客户端收集命令行参数,包括请求数量,请求通道缓冲区的大小以及发送请求的工作线程数量(分别为-n,-b和-w)。

用户想要多少个工作线程是我必须在客户端和服务器之间创建多少个请求通道。

RequestChannel *channel;

int main(int argc, char * argv[])
{
    char *n=NULL, *b=NULL, *w=NULL;
    int num, buf, workers;
    char optchar=0;

    while((optchar=getopt(argc,argv,"n:b:w:"))!=-1)
    switch(optchar)
    {
        case 'n':
            n=optarg;
            break;
        case 'b':
            b=optarg;
            break;
        case 'w':
            w=optarg;
            break;
        case '?':
            break;
        default:
            abort();
    }
    num=atoi(n);
    buf=atoi(b);
    workers=atoi(w);

    channel=malloc(workers*sizeof(RequestChannel));

    cout << "CLIENT STARTED:" << endl;

    pid_t child_pid;
    child_pid = fork();

    if(child_pid==0)
    {
       execv("dataserver", argv);
    }
    else
    {
        cout << "Establishing control channel... " << flush;
        RequestChannel chan("control", RequestChannel::CLIENT_SIDE);
        cout << "done." << endl;

        for(int i=0;i<workers;i++)
            RequestChannel channel[i](chan.send_request("newthread"), RequestChannel::CLIENT_SIDE);
    }
}


我在malloc行中遇到编译错误,我不知道问题是什么。我只希望能够像RequestChannel一样访问每个channel[i]

现在的样子,我收到一条错误消息:


  从void*RequestChannel*的无效转换


当我用sizeof(RequestChannel)替换sizeof(*RequestChannel)时,我收到一条错误消息:


  ')'标记之前的预期主要表达式。

最佳答案

malloc行是正确的(但是请检查它是否返回NULL)。 C ++编译器(不是C)会抱怨,因为在C ++中,您需要强制转换:

channel = static_cast<RequestChannel *>malloc(...);


或者,使用C语法:

channel = (RequestChannel*) malloc(...);

10-06 12:28