2012-05-09 45 views
1

這可能很簡單,但我不明白爲什麼我不能從這個char *中獲得值。C - 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_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 
} 

函數返回後,局部變量是不確定的,它的存儲可以通過下一個功能可以重複使用等

如何解決這一問題?有很多種可能的方式,但最簡單的可能是:

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有點像#define它使用ALL_CAPS)。

我希望你對readLine()有適當的檢查。我對自己的修改很懶,只是確保全局比本地變量長(五倍)。調整以適應自己。我也使用enum作爲緩衝區大小(並且使用小寫名稱而不是DIR_ENTRY_PATH)。

+0

Omg。如此愚蠢。謝謝。 – Jordan

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);