1

これはおそらく単純なことですが、この char* から値を取得できない理由がわかりません。

これが私の問題です:

static char* DIR_ENTRY_PATH = NULL;

...

while (1) // infinite loop

    {

      // accept a client connection 

      clientFd = accept (serverFd, clientSockAddrPtr, &clientLen);

      if (fork() == 0) // Create child proc to get dir entry info 

        {

          //read dir entry info     
readInfo(clientFd);
printf("dpath: %s\n", DIR_ENTRY_PATH); //prints out the the correct value (DIR_ENTRY_PATH set in readInfo)
int test = 1;
      //get dir entry info and write back
      DIR *dir;
      struct dirent *entry; //pointer to dir entry
      struct stat stbuf; //contains file info

      if((dir = opendir(DIR_ENTRY_PATH)) == NULL){ //make sure entry is valid
        printf("error with dirent\n");
            exit(1);
      }
      else{
        printf("gathering directory entry info...\n");
        while((entry = readdir(dir)) != NULL){
            char *entryname = entry->d_name;
printf("path: %s\n", DIR_ENTRY_PATH); /*prints nothing out.. */ - PROBLEM IS HERE
printf("int: %d\n", test); //*prints 1 out.. */

...

readInfo():

//reads info from the client
void readInfo(int fdesc){
  int fd = fdesc;
  char str[200];

  readLine(fd, str); //read line in from socket
  DIR_ENTRY_PATH = str; 
  printf("received path: %s\n", DIR_ENTRY_PATH); //displays correct value
}
//reads a single line
int readLine(int fdesc, char *strng){
 int fd = fdesc;
 char *str = strng;
 int n;

 do{
   n = read(fd,str, 1); //read a single character
 }while(n > 0 && *str++ != 0);
 return (n>0); //return false if eoi
}//end readLine

テスト int の値を取得できるのに、dir_entry_path を取得できないのはなぜですか? 助けてくれてありがとう。

4

2 に答える 2

6

ローカル変数へのポインターをグローバル変数に割り当てていますが、関数が戻ると、ローカル変数はなくなります!

void readInfo(int fdesc){
  int fd = fdesc;
  char str[200];             // Local variable

  readLine(fd, str);
  DIR_ENTRY_PATH = str;      // Pointer assigned to global
  printf("received path: %s\n", DIR_ENTRY_PATH); //displays correct value
}

関数が戻った後、ローカル変数は未定義であり、そのストレージは次の関数などで再利用できます。

問題を解決するには?考えられる方法はたくさんありますが、最も簡単な方法は次のとおりです。

static char DIR_ENTRY_PATH[1024];

void readInfo(int fdesc){
  int fd = fdesc;
  char str[200];                  // Local variable

  readLine(fd, str);
  strcpy(DIR_ENTRY_PATH, str);    // Copy local string into global string

  printf("received path: %s\n", DIR_ENTRY_PATH); //displays correct value
}

文体上のポイントとして、ALL_CAPS は通常、マクロまたはenum値を示します (これenumは、ALL_CAPS を使用するのと少し似ているためです#define)。

で適切な境界をチェックしていただければ幸いですreadLine()。私は変更を怠って、グローバルがローカル変数よりも (5 倍) 長いことを確認しました。自分に合うようにチューニングしてください。また、バッファー サイズに を使用しenumます (および の代わりに小文字の名前を使用しDIR_ENTRY_PATHます)。

于 2012-05-09T05:37:15.640 に答える
1

必要に応じて、 readInfo() を呼び出す前に、または関数 readInfo() 内でグローバル ポインター DIR_ENTRY_PATH にメモリを割り当てることができます。

#define DIR_ENTRY_LEN 200

void readInfo(int fdesc){
....

// Add below code <br>
strncpy(DIR_ENTRY_PATH, str, DIR_ENTRY_LEN); 
于 2012-05-09T05:57:52.127 に答える