Char数组似乎被神秘地解除分配

时间:2012-02-07 02:59:31

标签: c++ arrays

我正在用c ++创建一个基本的文件系统,并且在我的目录表中为文件分配名称时遇到了问题。这是directoryEntry结构的定义。

typedef struct{
   char name[112];
   unsigned int index;
   unsigned int size;
   unsigned int type;
   unsigned int creation;
} directoryEntry;

以下是我创建新空白文件的一些代码。

if(canFit){
    for ( int i = 0; i < numClusters; ++i){

        if (directoryTable[i].name[0] == 0x00){
            //directoryTable[i].name = *newFile;
            strcpy(directoryTable[i].name, newFile);
            printf("%s   %d   ", directoryTable[i].name, i);
            directoryTable[i].index = location;
            directoryTable[i].size = 0;
            directoryTable[i].type = 0x0000;
            directoryTable[i].creation = time(NULL);
            return 0;
        }
    }

这里发生的是我正在扫描目录表,查找包含空字节作为文件名的第一个字符的条目。这告诉我那个特定的目录条目没有被占用。然后我使用strcpy来分配newFile(它被声明为参数char newFile [112])。

问题是目录名称在上面的printf中正确打印(printf(“%s%d”,directoryTable [i] .name,i);)但是它似乎包含在directoryTable [i] .name中的数据被删除。上面的代码包含在一个名为touch的方法中。当代码执行时,我得到如下内容:

触摸( “文件1”); file1 0

触摸(“file2的); file2 0

这意味着与索引0关联的值暂时更改为file1,但随后又更改回几个空字节(这是最初分配的方式。)所以我的问题是,为什么不使用directoryTable的值[i]通过多次触摸来保持不变? directoryTable是一个全局变量,所以如果赋值,它就不应该在超出范围时消失。

还应该注意,如果对我的问题有任何影响,则directoryTable被定义为directoryEntry * directoryTable。

我的教授不允许我们在C ++中使用大多数标准库。例如,字符串是非法的。所以如果你想知道,那就是我没有使用字符串的原因。

感谢您的时间。

编辑:

这是代码,其中组成directoryTable的directoryEntrys被分配并添加到directoryTable中。它们也被添加到文件中,但我觉得这与这个特定问题无关:

    fseek(fp, clusterSize * root, SEEK_SET);

    for (int i = 0; i < bootRecord[0] / 128 ; ++i){
        fseek(fp, clusterSize * root + 128 * i, SEEK_SET);

        directoryEntry * newEntry = (directoryEntry *)malloc(sizeof(directoryEntry));
        //newEntry->name = (char *)malloc(112);
        //memset(newEntry->name, 0x00, 112);
        newEntry->size = 0;
        newEntry->type = 0;
        newEntry->creation = 0x0000;
        newEntry->index = 0;

        fwrite(newEntry->name, 112, 1, fp);
        fwrite(&newEntry->size, sizeof(int), 1, fp);
        fwrite(&newEntry->type, sizeof(int), 1, fp);
        fwrite(&newEntry->creation, sizeof(int), 1, fp);
        fwrite(&newEntry->index, sizeof(int), 1, fp);

        directoryTable[i] = *newEntry;
    }

1 个答案:

答案 0 :(得分:0)

您需要为目录表定义某种实际存储:

#define NUM_FILES 15 
DirectoryEntry directoryTable[NUM_FILES]

您定义的指针只指向随机存储器。我很惊讶它不会发生段错误。

修改

您对DirectoryEntries进行了malloc,但是您没有将它们存储在任何有效的位置。您的指针没有存储空间,因此只要将它们分配给directoryTable就会丢失它们您需要创建一个DirectoryEntry数组*:

DirectoryEntry* directoryTable[MAX_ENTRIES]

你可以放置malloc指针,或者只是在运行时创建整个表:

DirectoryEntry* directoryTable;

int newFS(int size, int clusterSize) {
    //Use C++ 'new' instead of malloc
    directoryTable = new DirectoryEntry[size / clusterSize];

    //Make sure to 'delete directoryTable' at program completion.
}