繁体   English   中英

字符指针的地址更改

[英]Character pointer's address changing

我对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 怎么了?

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

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

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

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

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

load_map( fileName, map );

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

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

if ( count % 23 == 0 ) continue;

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

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

并且由于您的输入数组仅可容纳12组24个字符的空间,因此您应该检查以确保您不会越过……这只是一种可供黑客利用的代码。数十亿美元的损失。

您还遇到其他一些问题,如在其他答案和评论中所指出的,还有一些其他人没有提到的问题。例如,您在错误的位置检查EOF……读取字符,存储没有意义将其放在数组中, 然后检查它是否为EOF。 将EOF读入char是未定义的行为(在该程序中,您有很大的行为)。c必须是int

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM