簡體   English   中英

C編程-處理字符串數組時出現分段錯誤

[英]C Programming - Segmentation fault when Manipulating Array of Strings

我正在努力解決將dns變量從大小10更改為大小32時發生的分段錯誤。我相信在main中dns ariable的聲明是創建一個由10個字符串組成的數組,然后將其增加到32個字符串時, 32個字符串。

因此,當使用大小為10的dns變量執行時,我得到以字母D開頭的4個目錄名稱的輸出。這是預期的輸出。

如果將dns變量的大小增加到32,則仍會得到4個目錄名稱,然后立即出現分段錯誤。

自從我編碼以來已經很長時間了,並且我確定自己在某處違反了內存。

任何幫助是極大的贊賞。

謝謝,

擔。

void ld_dirs(char *strings[])
{
   int count;
   DIR *dp;
   struct dirent *ep;

   dp = opendir ("/tmp/sysinfo/inputs");
   if (dp != NULL)
   {
      count = 0;

      while (ep = readdir (dp))
      {
         if (ep->d_name[0] == 'D')
         {
            strings[count] = malloc (80 * sizeof(char));
            strings[count] = ep->d_name;
            count ++;
         }
      }

      closedir (dp);
   }
   else
      perror ("Could not open the directory");
}

int main ()
{
   char cwd[120];
   int count, count2;
   char *dns[10];
   char *path;
   if (getcwd(cwd, sizeof(cwd)) != NULL)
      printf ("\nCurrent working directory : %s\n\n\n", cwd);
   else
      perror ("getcwd() error");

   ld_dirs (dns);

   count = 0;

   puts ("List of valid inputs :\n");

   while (dns[count] != NULL)
   {
      puts (dns[count]);
      count ++;
   }     

   printf ("There are %d valid inputs\n", count);
   return 0;
}

我馬上看到的一個問題是,您正在繼續將readdir的返回值重用於不同的字符串表條目,並覆蓋剛分配給保存名稱的地址。 但是我不認為可以確保readdir為每個調用返回一個新的,已分配的目錄條目結構。 我懷疑不是,訪問先前的結果之一導致分段錯誤只是時間問題。

您需要從每個使用readdir讀取的目錄條目中復制數據:

  while (ep = readdir (dp))
  {
     if (ep->d_name[0] == 'D')
     {
        strings[count] = malloc(80 * sizeof(char));
        //ERROR: strings[count] = ep->d_name;
        strcpy(strings[count], ep->d_name);  //CORRECTED
        count ++;
     }
  }

到目前為止,我沒有檢查其他錯誤。

我看到的問題:

  1. 數組大小。

    您已聲明:

     char *dns[10]; 

    您在ld_dirs沒有任何代碼來確保您使用的strings超出合法范圍。

  2. 您尚未將dirs的項目初始化為NULL但在接下來的while循環中,您希望這些項目的值為NULL

     while (dns[count] != NULL) { puts (dns[count]); count ++; } 

您可以通過以下方法解決這些問題:

  1. dns的項目初始化為NULL

     char *dns[10] = {0}; 
  2. 將數組的大小傳遞給ld_dir ,並確保不要使用超出合法范圍的內容。

    將功能界面更改為:

     void ld_dirs(char *strings[], int size) 

    將呼叫更改為:

     ld_dirs (dns, sizeof(dns)/sizeof(*dns)); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM