在 C 中使用动态字符 ** 的奇怪行为



我很久以前曾经用C编写代码,但我似乎失去了我的印章。

我在使用动态char *数组时遇到了一些奇怪的行为。我有一个curses窗口(在另一个文件中实现(,用于显示本地计算机上活动CU和TTY设备的字符串列表。我尝试用callocchar **数组进行零初始化,然后在每次(dir->d_name(与我的字符串比较匹配时将其增加一个适当的大小。

问题是这些字符串在运行程序时显示一半的时间,另一半时间它们是乱码或空白的。

我怀疑这是与malloc()calloc()有关的内存/指针问题,但几天来我一直无法确定我的误解。这是代码:

#include <stdio.h>
#include "funcs.h"
#include <ncurses.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#define arraysize(ar) sizeof(ar)/sizeof(ar[0])
int main(void) 
{
char ch;
const char tty[4] = "tty.";
const char cu[3] = "cu.";
const char *directory = "/dev/";
const char **devices = calloc(0,sizeof(const char *));
// Initial device list gen //
DIR *d;
struct dirent *dir; 
int count=0;
d = opendir(directory); 
if (d != NULL)
{
while((dir = readdir(d)))
{
if(strncmp(dir->d_name,tty,4)==0 || strncmp(dir->d_name,cu,3)==0)
{
count++;
devices = realloc(devices,(count+1)*sizeof(const char *));
devices[count-1] = (dir->d_name);
}   
}
closedir(d);    
}
printf("n%dn",count);
struct display MAIN = screen_init();
// Display List //
list_devices(devices,count,MAIN.devpad);
while(ch != 'q')
{
ch = getch();
}
endwin();
}

感谢您的时间/关注。

这里最大的问题是你没有复制dird_name缓冲区。正如手册所说:

readdir()返回的数据可能会被后续调用同一目录流的readdir()覆盖。

这意味着您需要显式复制它:

devices[count-1] = strdup(dir->d_name);

这应该可以消除很多乱码。

相关内容

  • 没有找到相关文章

最新更新