3

我有一个奇怪的问题,我不知道如何解决它。

我正在读取一个 50x50 字符的文本文件,并希望将其写入一个 50x51 的动态数组(用 '\0' 填充第 51 个插槽)。

之后我将整个阵列打印到控制台上。它应该显示 50 行,每行 50 个字符,因为这是输入。

它也很好用——除了第一行。由于某种原因总是错误的。

#define FIELD_SIZE 50
int main(int argc, char** args){
    char* data = ReadFile("start.txt");

    char** map = (char**) malloc( FIELD_SIZE );

    if(map==NULL)
        __debugbreak();

    {
        int i;
        for(i = 0; i < FIELD_SIZE; i+=1){
            map[i] = (char*) malloc(FIELD_SIZE+1);

            if(map[i]==NULL)
                __debugbreak();
            //(FIELD_SIZE+1) in order to skip the '\n' at the end of each line.
            memcpy( &map[i][0], &data[i*(FIELD_SIZE+1)], FIELD_SIZE);
            map[i][FIELD_SIZE] = '\0';
        }
    }


    {
        int i;
        for(i = 0; i < FIELD_SIZE; i+=1){
            printf("%s\n", map[i]); //<-- prints something bad for i==0
        }
    }

    free(data);

    return 0;
}

这是程序执行后我的控制台的样子: 在此处输入图像描述 第一行也应该是“aaaaaaaaaaaaa ...”。所以这似乎是一个坏指针或什么的。

但是,如果我将 FIELD_SIZE 减小到 20(并分别读取 20x20 文本文件),它可以正常工作。

我没有看到数组大小和第一个索引之间的联系不起作用。由于 malloc 从未返回 0,因此分配没有问题。

我正在使用 VS2010 C++ 编译程序,但我必须将自己限制在 C 子集。

4

2 回答 2

5

char** map = (char**) malloc( FIELD_SIZE );

char** map = (char**) malloc( FIELD_SIZE * sizeof(char*));

我不知道这是否是您代码中的错误。您分配 50 个字节,但在 map 中需要 50 个字节 x 4 个字节/指针。

于 2012-05-17T19:26:29.350 回答
0

很快就注意到了。在这种情况下,它可能是无用的。Memcpy 将指针的地址而不是引用的值作为其来源,因此通常您不应该按照您的方式使用它。据我所知,您正在尝试一次复制一行。

memcpy( map[i], &data[i*(FIELD_SIZE+1)], FIELD_SIZE);

尝试一下,尽管它可能无法解决您的问题。

于 2012-05-17T19:23:37.107 回答