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