realloc()突然中止C程序

realloc()突然中止C程序,c,unix,realloc,C,Unix,Realloc,请注意,我已经通过了 但是,我觉得它没有帮助 我想动态创建一个字符串数组,以文件名作为字符串 这是我的代码: #include <stdio.h> #include <dirent.h> #include <errno.h> #include <stdlib.h> #include <string.h> int main(int argc, char* argv[]) { DIR *dir = NULL

请注意,我已经通过了

但是,我觉得它没有帮助

我想动态创建一个字符串数组,以文件名作为字符串

这是我的代码:

#include <stdio.h>
#include <dirent.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>


int main(int argc, char* argv[])
{  
    DIR         *dir = NULL;
    struct dirent   *file = NULL;
    int         i = 0;
    unsigned short  len;

    if ( (dir = opendir(".") ) == NULL ) {
        if (errno != 0) {
            perror("Unable to open current directory");
            exit(EXIT_FAILURE);
        }
    }

    char    **filename = NULL;

    while ( (file = readdir(dir)) != NULL ) {

        if (i == 0) 
            filename = malloc(sizeof(char*)*(i+1));     
        else 
            filename = realloc(filename,i+1);


        filename[i] = strdup (file->d_name);
        printf("%s  ", filename[i] );
        i += 1;
    } 
    if ( errno != 0 ) {
        perror("Unable to read from the current directory");
        exit(EXIT_FAILURE);
    } 

    if (dir != NULL) {
        if (closedir(dir) == -1) {
            if (errno != 0) {
                perror("Unable to close the current directory");
                exit(EXIT_FAILURE);
            }
        }
    } 
    printf("\n");
    return 0;
}
最初,对于一些filenemes,它做得很好,但突然,它因上述错误而中止

任何帮助都将不胜感激。

错误的重新分配

// filename = realloc(filename, i+1);
filename = realloc(filename,(i+1) * sizeof *filename);`
顺便说一句:不需要区分内存分配调用。由于指针初始化为
NULL
,因此在第一次和后续时间使用
realloc()

char **filename = NULL;
...
// if (i == 0) filename = malloc(sizeof(char*)*(i+1));     
// else filename = realloc(filename,i+1);
filename = realloc(filename,(i+1) * sizeof *filename);`

@PaulMcKenzie很好地指出,代码应该检查有问题的返回值。此外,
fileanme
最终应该是
free()

一个问题是,在调用
realloc
malloc
后,你没有检查
filename
是否为空。@PaulMcKenzie是的,我应该检查一下,谢谢你指出。文件名(通常)超过1或2个字符。您的malloc仅用于1或2个字符。malloc实际上需要是文件名的完整长度,包含在文件结构的file->d_name成员中。dup操作通过分配的区域将字符复制到堆中,从而损坏堆。这就是导致坠机的原因。注意程序中还有其他几个错误,但这是主要错误。是的,这个解决方案工作得非常好。我实际上已经习惯了做如下事情:filename=realloc(filename,(I+1)*sizeof(char*);但是,现在根据你的解决方案,我知道我可以简单地取消对指针的引用。
char **filename = NULL;
...
// if (i == 0) filename = malloc(sizeof(char*)*(i+1));     
// else filename = realloc(filename,i+1);
filename = realloc(filename,(i+1) * sizeof *filename);`