二维数组。第一个索引错误,其他所有错误

时间:2012-05-17 19:11:01

标签: c arrays visual-studio-2010 pointers

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

我正在读取一个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;
}

以下是程序执行后我的控制台的样子: enter image description here 第一行也应该是“aaaaaaaaaaaaaa”。 所以它似乎是一个糟糕的指针或其他东西。

如果我将FIELD_SIZE缩减为20(并分别读取20x20文本文件),则可以正常工作。

我没有看到数组大小和第一个索引之间没有连接。由于malloc从未返回0,因此分配没有问题。

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:0)

快速注意到的事情。在这种情况下,它可能毫无用处。 Memcpy将其源代码指针的地址而不是refrenced值,所以通常你不应该按照你的方式使用它。据我所知,你一次要复制一行。

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

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