[英]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.