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

emanlee 阅读:58 2024-11-01 17:39:52 评论:0

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

我正在读取一个 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 子集。

请您参考如下方法:

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

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

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


标签:程序员
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号