gpt4 book ai didi

c - C 中动态字符 ** 的奇怪行为

转载 作者:太空宇宙 更新时间:2023-11-04 02:29:47 24 4
gpt4 key购买 nike

我很久以前用 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%d\n",count);

struct display MAIN = screen_init();

// Display List //

list_devices(devices,count,MAIN.devpad);
while(ch != 'q')
{
ch = getch();
}
endwin();
}

感谢您的时间/关注。

最佳答案

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

The data returned by readdir() may be overwritten by subsequent calls to readdir() for the same directory stream.

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

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

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

关于c - C 中动态字符 ** 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44993238/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com