我目前正在编写一个打开指定目录并读取其内容的程序。而不是使用printf()在找到文件名后立即显示它们。我把它们放在记忆中,然后再显示出来。我使用以下if语句来触发内存重新分配。我还包括了相关变量的声明。
//Represents what the new index will be after the current file name is added
//to 'stack.ptr'
#define NEW_INDEX (stack.index+(strlen(ptr_dirent->d_name)))
//Contains the pointer that points to the directory's contents 'stack.ptr',
//the size of 'stack.ptr' which is 'stack.size', and the current index
//'stack.index'
struct stack
{
int index;
char *ptr;
int size;
};struct stack stack;
//Sets the index to 0 and allocates 256 bytes of memory for 'stack.ptr'
stack.index = 0; stack.size = 256;
stack.ptr = malloc(sizeof(char)*stack.size);
if(NEW_INDEX > stack.size)
{
char *temp; stack.size *= 2;
temp = realloc(stack.ptr, sizeof(char)*stack.size);
if (temp == NULL)
{
printf("ERROR: %i Bytes of memory could not be allocated.\n", stack.size);
free(stack.ptr); closedir(dirp); return '\000';
}
else {stack.ptr = temp;}
}
该程序完美运行,直到我将'stack.size'(数组大小)的初始值设置为2而不是256(以便程序重新分配内存)。我的程序崩溃,因为realloc()返回NULL但我有足够的内存可用。我知道realloc()确实工作了几次因为 崩溃时'stack.size'为16(每次重新分配内存时'stack.size'加倍)。我尝试将'stack.size'设置为几个不同的值,我发现将'stack.size'设置为1或2会导致崩溃,并且当'stack.size'达到16时总会发生这种情况。任何人都可以向我解释这个?我担心即使我将'stack.size'设置为256,如果目录足够大以触发内存重新分配,我的程序可能会崩溃。另外在一个不相关的说明中,我读到了openddir(“。”);将打开当前目录,我发现它确实存在,但由于某种原因,并非当前目录中的所有文件都在'stack.ptr'和a中。当我将'stack.ptr'的内容输出到stdout时显示和..
答案 0 :(得分:3)
您没有向我们展示包含该错误的行。它可能看起来像:
strcpy(stack.ptr+stack.index, ptr_dirent->d_Name);
这里的问题是strcpy()
复制strlen() + 1
个字节。您正在编写超出已分配数组末尾的终止NUL字符。