簡體   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