2012-05-09 7 views
1

これはおそらく単純なものですが、なぜこのchar *から値を取得できないのかわかりません。ここでC - char *がnullですか?

は私の問題です:

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_paの値th?助けてくれてありがとう。

答えて

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 
} 

など、ローカル変数は未定義であり、そのストレージは、次の機能により再利用することができます

問題を解決するには?そこに多くの可能な方法があるが、最も簡単であるかもしれない:(enumはALL_CAPSを使用するビット#define似ているため)文体点として

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値です。

私はあなたがreadLine()にチェックを適切な境界を持っている願っています。私は私の修正で怠惰になり、単にグローバルがローカル変数より(5倍)長くなったことを保証します。あなた自身に合わせて調整してください。私はまた、DIR_ENTRY_PATHの代わりに、enumをバッファサイズ(および小文字名)として使用します。

+0

すっごいです。だから馬鹿だ。ありがとう。 – Jordan

1

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

#define DIR_ENTRY_LEN 200 

void readInfo(int fdesc){ 
.... 

// Add below code <br> 
strncpy(DIR_ENTRY_PATH, str, DIR_ENTRY_LEN);