c - 使用 malloc 和 realloc 动态地将字符串添加到 char 指针

标签 c linux dirent.h

我正在尝试使用 C 中的 Dirent 头文件读取目录。

我在将文件名存储在字符数组内的给定目录中时遇到问题。

代码如下。

char * FileNames;

while ( ( DirentPointer = readdir(DirectoryPointer) ) != NULL) {

    strcpy(&FileNames[Counter], DirentPointer -> d_name);

    Counter++;
}

当我运行应用程序时,我遇到了段错误。我认为 strcpy 由于内存分配而导致应用程序出现故障。

谁能告诉我如何使用 malloc 和 realloc 动态地将内存分配添加到 FileNames Char * 中?

最佳答案

您的代码会产生未定义的行为或者很可能会崩溃。这是因为 FileNames 是指向字符的指针,而不是指向将字符串复制到其中的内存缓冲区的指针,并且函数 strcpy 不会对复制到的缓冲区进行边界检查。因此,strcpy 将尝试写入您尚未为此目的分配的内存。您需要先分配内存来复制文件名。

#define MAX_FILE_NUM 1000

char *FileNames[MAX_FILE_NUM] = {0}; // initialize to NULL
int Counter = 0;

while((DirentPointer = readdir(DirectoryPointer)) != NULL) {
    FileNames[counter] = malloc(strlen(DirentPointer->d_name) + 1); // + 1 for the null byte
    // check for NULL
    if(FileNames[i] != NULL) {
        strcpy(FileNames[i], DirentPointer->d_name);
        Counter++;
    }
    else {
        // handle the NULL case
        // maybe try malloc again 
    }
}

// after you are done with the FileNames

for(int i = 0; i < Counter; i++) {
    free(FileNames[i]);
    FileNames[i] = NULL;
}

关于c - 使用 malloc 和 realloc 动态地将字符串添加到 char 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21882003/

相关文章:

c - 关于 setjmp/longjmp

linux - 为什么linux在异常处理程序的序言中将数据段设置为__USER_DS

linux - 如何将发布文件转换为 git repo

linux - 更改运行 Angstrom Linux 的 BeagleBone UART0 的波特率

c++/正在寻找有关目录和文件的文档(如 dirent.h)?

c - strtok/strtok_r 中途退出解析

c - 在执行 strcmp 之前检查第一个字符有用吗?

c - 为什么会泄漏内存? (指针数组 C)

c++ - Linux 目录 : Getting a list of all folders inside a directory

c - 在 C 中访问目录