我用的这个办法 :
char *Queue[10]; //一个全局的字符串指针
初始化: for(int i=0;i<10;i++)
            Queue[i]=new char[100];
线程1 线程2可以互斥的对Queue访问 其中:
线程1通过 Append(char *str,dwTimeOut TiemOut)
         {      .........
                memcpy(Queue[j],str,strlen(str);
               .........
         }    //将数据加入队列。
线程2 通过Fetch(char *str,dwTimeOut TimeOut)
            {    ...........
                 memcpy(str,Queue[0],strlen(Queue[0]));
                 .........
            }  //从队列中取出指针
通过调试发现 不能的到正确的数据 请大家帮忙! 分可以加!

解决方案 »

  1.   

    不是啊 两个线程是通过cmutex csemaphore互斥访问队列的...
    我现在想知道可不可以这样来传递....
    线程中的指针好像不行 我试了(不知道有没其他错误)
    改成memcpy拷贝数据 还是不行... 高手帮忙。
      

  2.   

    应该可以的。不知道你传进来就错了,还是取值不对。另外,你的Fetch传进来的char *str,str的空间是在什么地方开的?如果是在Fetch中就会出错,因为str在传回的时候就会destroy掉,只是调用函数参数的拷贝,需要在外面或者用二级指针。
      

  3.   

    如果在Fetch中new的,你的char*str就不会返回正确的东西了,因为你new的东西,主程序更本不知道。用二级指针,或者在外面开好,可以在外面先用数组试试看,如char chbuf[255] = {0}, 再把chbuf传过去,看看是否正确,如果正确,再用二级指针
      

  4.   

    如果在Fetch中new的,你的char*str就不会返回正确的东西了,因为你new的东西,主程序更本不知道。
    -------------------------------------------------------------------------
    Fetch(char *str,dwTimeOut TimeOut)
                {    ...........
                     memcpy(str,Queue[0],strlen(Queue[0]));//这里不是拷贝过去了吗?
                     .........
                }  //从队列中取出指针
    ---------------------------------------------------------------------
    或者在外面开好,可以在外面先用数组试试看
    我试试看
      

  5.   

    见林锐的高质量编程中的例子
    void GetMemory(char *p)
    {
    p = (char *)malloc(100);
    }
    void Test(void) 
    {
    char *str = NULL;
    GetMemory(str);
    strcpy(str, "hello world");
    printf(str);
    }请问运行Test函数会有什么样的结果?
    答:程序崩溃。
    因为GetMemory并不能传递动态内存,
    Test函数中的 str一直都是 NULL。
    strcpy(str, "hello world");将使程序崩溃。
      

  6.   

    其实在我的程序中是折中情况:
    void GetMemory(char *global)
    {
        char *p=NULL; 
        p = global;    //p和global指向同一块堆内存
        cout<<(LPCSTR)p<<endl;   
    }
    void Test(void) 
    {
    char *str =(char *)new(sizeof(char)*10);
    str="hello world";
    GetMemory(str);
    }