2014-02-19 35 views
-1

我想在C动态添加字符串到字符指针使用malloc和realloc

我有麻烦存储字符数组内的指定目录内的文件名来读取使用的dirent头文件的目录。

代码如下。

char * FileNames; 

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

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

    Counter++; 
} 

当我运行该应用程序时,我得到一个分段错误。我认为strcpy由于内存分配而导致应用程序错误。

任何人都可以告诉我如何malloc和realloc可以用来动态地添加内存分配到FileNames Char *吗?

+1

我想你的第一个问题是'FileNames'只是一个字符数组。你需要和指向字符的指针来存储所有的名字'char ** FileNames;' –

+0

我是新来的语言,要诚实。如果我创建一个指向指针的指针,我怎样才能在strcpy方法中引用数组?我应该使用&&吗? – Andrew

+0

看看本教程,它可能很有用:http://www.cplusplus.com/doc/tutorial/pointers/ –

回答

1

你的代码会产生未定义的行为或最可能的崩溃。这是因为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; 
} 
+0

谢谢你的回应。我仍然试图弄清楚如何使用指针。我试过你的代码,但我在strcpy方法中遇到了不兼容的指针类型错误。 – Andrew

+0

我假设'DirentPointer-> d_name'是'char *'。你能告诉我它是什么类型吗? – ajay

+0

@Andrew对不起,我的代码有错误。我已经更新了它。请现在再试一次,让我知道它是否有效。 – ajay