簡體   English   中英

Linux <-> Windows存儲字符串地址

[英]Linux <-> Windows Storing an address of string

在Linux上編寫應用程序時遇到嚴重問題。 我有這個代碼

#include <stdio.h>

int main()
{
    char ar[10][10];
    strcpy(ar[1], "asd");
    strcpy(ar[2], "fgh");

    int test[2];
    test[1] = (int)ar[1];
    printf("%s %x | %s %x\n\n", ar[1], ar[1], test[1], test[1]);

    return 0;
}

它在Windows上運行良好,但是當我想在Linux上運行時,出現了Segmentation Fault或對內存的未授權訪問。

您的程序調用未定義的行為。 它假定一個指針將適合int ,這不是必需的。 通常,指針將適合Unix機器,而在Windows上將失敗。 但是如果需要進行此類轉換,則應使用適當的整數類型,例如stdint.h intptr_t 請注意,嚴格來講,整數必須在傳遞給printf之前printf轉換為指針類型。

使用指針類型來printf和足夠大的整數類型會導致正確的行為: http : //ideone.com/HLExMb

#include <stdio.h>
#include <stdint.h>

int main(void)
{
    char ar[10][10];
    strcpy(ar[1], "asd");
    strcpy(ar[2], "fgh");

    intptr_t test[2];
    test[1] = (intptr_t)ar[1];
    printf("%s %x | %s %x\n\n", ar[1], ar[1], (char*)test[1], (char*)test[1]);

    return 0;
}

請注意,盡管通常將指針轉換為整數類型並不容易,並且可能會導致程序錯誤。 除非您出於某種原因而絕對需要這樣做,否則不要去那里。 當您開始使用C語言時,您不太可能需要這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM