我对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
。发生了什么事?
答案 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
。