[英]mmap() causing segmentation fault in C
我很確定我的錯誤非常明顯,但我似乎無法找到問題所在。
我正在學習如何在 C 中使用mmap()
,一切對我來說都是正確的,但是我遇到了分段錯誤。
這是我的代碼:
int n=50;
char * tab = mmap(NULL, n, PROT_READ | PROT_WRITE, MAP_SHARED, -1, 0);
for(int i=0; i<n; i++)
{
tab[i] = 1;
}
使用valgrind
,我在執行tab[i]=1
的行收到一條錯誤消息,提示“大小 1 的無效寫入”,(我曾嘗試將1
替換為'1'
認為 char 的大小可能小於int
,但仍然得到相同的錯誤),然后是“地址0xfffff..ff
不是堆棧的、malloc 的或(最近)釋放的”。
我不知道我的錯誤在哪里。 有人可以幫我找到嗎?
來自man 2 mmap
:
文件映射的內容(與匿名映射相反;請參閱下面的
MAP_ANONYMOUS
)使用從文件描述符fd
引用的文件(或其他對象)中的偏移offset
開始的length
字節進行初始化。
我想您正在嘗試創建一個匿名映射(即不受文件支持)。 在這種情況下,您需要將MAP_ANONYMOUS
添加到flags
,否則系統將嘗試從指定的fd
讀取,這是無效的 ( -1
) 並且會失敗。
正確的代碼是:
char *tab = mmap(NULL, n, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
if (tab == MAP_FAILED) {
perror("mmap");
exit(1);
}
對於未來,請注意,如果返回值指示失敗,您可以像上面一樣通過簡單地調用perror()
輕松檢測錯誤。 在您的情況下,它應該打印以下內容:
mmap: Bad file descriptor
再次檢查手冊,您可以在“錯誤”部分看到:
EBADF :
fd
不是有效的文件描述符(並且未設置MAP_ANONYMOUS
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.