[英]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 ++;
}
}
到目前為止,我沒有檢查其他錯誤。
我看到的問題:
數組大小。
您已聲明:
char *dns[10];
您在ld_dirs
沒有任何代碼來確保您使用的strings
超出合法范圍。
您尚未將dirs
的項目初始化為NULL
但在接下來的while
循環中,您希望這些項目的值為NULL
。
while (dns[count] != NULL) { puts (dns[count]); count ++; }
您可以通過以下方法解決這些問題:
將dns
的項目初始化為NULL
。
char *dns[10] = {0};
將數組的大小傳遞給ld_dir
,並確保不要使用超出合法范圍的內容。
將功能界面更改為:
void ld_dirs(char *strings[], int size)
將呼叫更改為:
ld_dirs (dns, sizeof(dns)/sizeof(*dns));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.