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.. */

...

读取信息():

//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

为什么我能得到 test 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有点像#define使用 ALL_CAPS)。

我希望你有适当的界限检查readLine()。我对我的修改很懒惰,只是确保全局变量比局部变量长(五倍)。调成适合自己的。我还将使用 aenum作为缓冲区大小(和小写名称而不是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 回答