字符指针的地址改变

时间:2013-08-22 08:31:31

标签: c pointers memory char

我对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 个答案:

答案 0 :(得分:2)

我认为这是未定义的行为。

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

答案 1 :(得分:1)

这很可能是因为你在map之外写了数组的边界,所以你写出的数据溢出到mPtr变量。

此外,map函数中的变量main被声明为数组数组,但load_map期望它是char *(或单个 - 维数组)。如果您没有收到错误或至少有关于此的警告,我会感到惊讶。

答案 2 :(得分:1)

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

load_map( fileName, map );

是未定义的行为。您正在将类型为char const(*)[24]的指针值传递给期望char*的函数参数。这些是完全不同的野兽,所以难怪你执行的结果有点武断。

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

答案 3 :(得分:0)

if ( count % 23 == 0 ) continue;

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

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

由于您的输入数组只有12组24个字符的空间,您应该检查以确保不要过去...这只是黑客利用的一种代码,损失数十亿美元。

您还有其他几个问题,如其他答案和评论中所述,以及一些没有人提到过的问题......例如,您在错误的地方检查EOF ......阅读一个没有意义char,将它存储在一个数组中,然后检查它是否是EOF。并且未定义的行为(在此程序中有大量内容)将EOF读入char ... c需要是int