嗯我转给gpt3.5了,回答如下
如果你在使用操作系统(如Windows或Linux)时遇到了只读地址的错误,那可能是由于操作系统的内存保护机制导致的。在这种情况下,你需要使用操作系统提供的特定机制来修改只读内存。
在Windows和Linux上,操作系统会将只读内存映射为只读页面,以防止对其进行修改。如果你想要修改这些只读内存,你需要使用操作系统提供的函数来更改内存页面的保护属性。
在Windows上,你可以使用 `VirtualProtect` 函数来更改内存页面的保护属性。以下是一个示例代码:
```cpp
#include <Windows.h>
int main() {
const uint8_t tag[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5'};
uint8_t* tagPtr = const_cast<uint8_t*>(tag);
DWORD oldProtect;
VirtualProtect(tagPtr, sizeof(tag), PAGE_READWRITE, &oldProtect);
memcpy(tagPtr, "0123456789012345", sizeof(tag));
// 现在 tag 的值已经被修改了
return 0;
}
```
在Linux上,你可以使用 `mprotect` 函数来更改内存页面的保护属性。以下是一个示例代码:
```cpp
#include <sys/mman.h>
#include <cstring>
int main() {
const uint8_t tag[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5'};
uint8_t* tagPtr = const_cast<uint8_t*>(tag);
size_t pageSize = sysconf(_SC_PAGESIZE);
uintptr_t addr = reinterpret_cast<uintptr_t>(tagPtr);
uintptr_t pageStart = addr & ~(pageSize - 1);
mprotect(reinterpret_cast<void*>(pageStart), sizeof(tag), PROT_READ | PROT_WRITE);
memcpy(tagPtr, "0123456789012345", sizeof(tag));
// 现在 tag 的值已经被修改了
return 0;
}
```
请注意,这些代码在操作系统上使用特定的函数来修改内存保护属性,因此在不同的操作系统和平台上可能会有所不同。你需要根据你的操作系统和平台文档来查找适合的函数,并确保正确使用它们。
另外,请注意修改只读内存可能会导致不可预测的行为和系统不稳定性。请确保你明确了解你所做的更改,并在进行此类操作时谨慎。
【 在 yhwac 的大作中提到: 】
: 不带OS或简单的RTOS这样差不多可以,win或linux这个地址是只读,会报错
: 发自「今日水木 on 23013RK75C」
--
FROM 114.249.20.*