0

我对const char指针感到困惑。

这是代码:

int main()
{
    const char map[12][24];
    char fileName[] = "map1.txt";
    const char * mPtr;
    mPtr = map;


    printf( "%d %d \n", mPtr, map );

    load_map( fileName, map );

    printf( "%d %d \n", mPtr, map );


    return 0;
}

这是load_map()功能代码:

bool load_map( char * fileName, char * map )
{
    FILE * fptr;
    char c;
    int count = 0;

    fptr = fopen( fileName, "r" );

    if( fptr == NULL ) {
        printf( "Fail to read map \n" );
        return false;
    }

    do {

        c = fgetc( fptr );
        *( map + count++ ) = c;
        if ( count % 23 == 0 ) continue;
        *( map + count++ ) = ' ';


    } while( c != EOF );

    fclose( fptr );
}

我的问题是什么时候执行

mPtr = map;

并且它们具有完全相同的内存地址,但是在load_map()函数执行 后mptr的值发生了变化。

但在那个函数中,我没有引用mptr. 怎么了?

4

4 回答 4

2

我相信这是未定义的行为。

map数组被声明为const,但你在函数中写入它,这load_map()是错误的。为什么会这样const,当您显然期望并打算通过将数据加载到其中来更改它时?

于 2013-08-22T08:33:49.237 回答
1

您绝对应该打开编译器提供的所有警告级别。以下行

load_map( fileName, map );

是未定义的行为。您正在将类型的指针值传递给char const(*)[24]需要char*. 这些是完全不同的野兽,难怪你的处决结果有些武断。

任何体面的现代编译器都应该告诉你。

于 2013-08-22T08:38:07.787 回答
1

这很可能是因为您写入超出了数组的范围map,因此您写入超出范围的数据会溢出到mPtr变量中。

此外,函数中的变量mapmain声明为数组数组,但load_map预期它是一个char *(或一维数组)。如果您没有收到错误或至少对此发出警告,我会感到惊讶。

于 2013-08-22T08:35:03.633 回答
0
if ( count % 23 == 0 ) continue;

这个测试是错误的。您在每 23 个字符中的 22 个之后存储一个空白,因此肯定会覆盖数组。看起来你真正想要的是

     map[count++] = c;
     if ((count % 24) == 23) map[count++] = ' ';

而且由于您的输入数组只有 12 组 24 个字符的空间,因此您应该检查以确保您不会重复...这只是黑客利用的盛宴的代码,损失数十亿美元。

您还有其他几个问题,正如其他答案和评论中所指出的那样,还有一些没有人提到的问题......例如,您在错误的地方检查 EOF ......读取字符是没有意义的,存储它在一个数组中,然后检查它是否是EOF。将 EOF 读入 a char... c 必须是int.

于 2013-08-22T09:04:23.693 回答