簡體   English   中英

我可以將十六進制字符串作為地址傳遞給 C 中的 function 嗎?

[英]Can I pass a hexadecimal string as an address to a function in C?

我試圖將十六進制字符串作為地址傳遞給 function 作為參數。 但我不知道我可以合法訪問哪個地址。 所以我使用了一個變量並獲得了它的地址,希望我能知道我的進程可以使用的地址。 但它沒有用。 我得到分段錯誤 11。誰能解釋我為什么?

這是我的代碼:

#include <stdio.h>

void print_something(char *s) {
    printf("I was here\n");
    while (*s) {
        printf("%c", *s);
        s++;
    }
    printf("\n");
}

int main() {
    char a = 48;
    printf("%p\n", &a);
    print_something((char *) 0x7ffeec6a1b5b);
    return 0;
}

這就是我執行它時得到的:

0x7ffee31ecb5b
I was here
Segmentation fault: 11

誰能解釋一下為什么?

這僅僅是因為操作系統告訴您的程序它試圖訪問 memory 它不允許訪問。 您可以在此處閱讀有關它的詳細信息:什么是分段錯誤?

除非您正在編寫非常特定的代碼,例如操作系統內核或編碼嵌入式系統或類似的東西,否則您永遠不應該直接使用 memory 地址。 並且沒有可移植的方法來找出您可以訪問哪些地址。

“我試圖弄清楚編譯器是否可以理解我是否將十六進制字符串地址提供給需要指針作為參數的 function。”

“如果我向 function print_something()傳遞一個類似&a的值。它會起作用。但如果我傳遞給它一個類似0x7ffeec6a1b5b的值。它是否知道它是一個地址並訪問這個 memory 塊有這個地址?

Dũng Đào Xuân 2 分鍾前

編譯器不知道也不關心傳遞的地址值是否表示有效的 memory 地址。 它只是檢查指針的分配是否正確完成。

0x7ffeec6a1b5b也不是“六進制字符串”。 它是一個 integer 常量,需要強制轉換為要分配的指針類型:

“來自整數的指針/來自沒有強制轉換的指針的整數”問題

但是,如果您稍后嘗試通過取消引用指針來使用硬編碼值訪問此 memory 位置,如果地址無效或已使用(很可能是這種情況),它將調用未定義的行為

分段錯誤表明您沒有正確完成 memory 分配或 memory 訪問。 C 標准沒有明確提及分段錯誤,因為它們取決於實現。 它只是對未定義的行為進行分類。

Memory 地址通常由操作系統提供給請求程序。

作為程序員,您不應該關心特定 object 在大多數情況下准確存儲在哪里,並且您不應該嘗試在代碼中使用任何特定地址值,除非您為嵌入式系統編寫代碼,例如您可以在哪里確定您為哪個地址空間編碼。

所以回答你的問題:

我可以將十六進制字符串作為地址傳遞給 function 作為 C 中的參數嗎?

是的當然。 但是,將該字符串或更好的 integer 視為地址進行任何操作很可能會導致未定義的行為。 如果它為您的特定系統定義得很好,那么您的程序仍然是不可移植的。 所以總的來說,這樣做沒有多大意義(例外除外)。


邊注:

  • printf("%p\n", &a); 也被嚴格視為未定義的行為。 參數指針需要轉換為void * -> ``printf("%p\n", (void*) &a);`

是的,您可以提供一個十六進制數並將其轉換為指針。 但問題是你是否應該,並且(除非,也許,如果你在非常奇特的情況下破解某些東西),答案絕對不是

你得到分段錯誤,因為你告訴你的進程訪問一個虛擬 memory 地址,這個地址可能甚至沒有映射到你的進程中,即使它是,你也可能不允許訪問它,所以操作系統保護你免受造成混亂並簡單地殺死你的進程。

暫無
暫無

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

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