我理解指针如何工作的基础知识,但以下示例让我感到困惑.
int *myNum = 10; // Produces an error
char *myChar = "Something"; // Works fine
Run Code Online (Sandbox Code Playgroud)
为什么分配char工作但整数不工作(可能导致char被视为数组)?
在直接分配指针变量时,是什么让我感到困惑,它会自动获取地址吗?
char *myChar = "Something";
Run Code Online (Sandbox Code Playgroud)
和
char myChar = "Something";
char *charAddr = &myChar;
Run Code Online (Sandbox Code Playgroud)
这里有什么不同,或等于?
在分类并保存到文件时,有时会出现序列化输出如下所示的错误:
<?xml version="1.0"?>
<Template xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Route>Some Route</Route>
<TradePack>Something Here</TradePack>
<Transport />
</Template>te> ------> Notice this extra string?
Run Code Online (Sandbox Code Playgroud)
我正在序列化的类看起来像这样:
[Serializable]
public class Template
{
public string Route = string.Empty;
public string TradePack = string.Empty;
public string Transport = string.Empty;
public Template()
{
}
}
Run Code Online (Sandbox Code Playgroud)
我似乎无法弄清楚为什么会这样.这是我的序列化程序类:
public static bool Save(object obj, string path)
{
try
{
XmlSerializer writer = new XmlSerializer(obj.GetType());
using (var stream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
{
writer.Serialize(stream, obj);
}
return true;
}
catch { }
return …Run Code Online (Sandbox Code Playgroud) 我看到了一些教程,我无法理解为什么他们建议从虚拟保护方法中提出事件,而不是直接,有什么区别?
public delegate void SomethingEventHandler(string s);
public event SomethingEventHandler Something;
public void Main() {
// Raising an event
OnSomething(); // Via method
Something("something"); // Directly
}
protected virtual void OnSomething()
{
Something("something");
}
Run Code Online (Sandbox Code Playgroud) 我真的不明白两者之间有什么区别:
private void Send<T>(T packet) where T : IPacket
Run Code Online (Sandbox Code Playgroud)
和
private void Send(IPacket packet)
Run Code Online (Sandbox Code Playgroud)
既然通用有限制,那不是一模一样吗?如果不是,那么这里的区别是什么?使用带有约束的通用方法相对于简单方法有什么优点?
谢谢!
我在下面的例子中看到了一个运算符 =>:
public int Calculate(int x) => DoSomething(x);
Run Code Online (Sandbox Code Playgroud)
或者
public void DoSoething() => SomeOtherMethod();
Run Code Online (Sandbox Code Playgroud)
除了在 Lamba 表达式中,我以前从未见过像这样使用这个运算符。
以下有什么作用?应该在哪里、什么时候使用?
在C++中使用类型转换时,我有时会感到困惑,这些回归到底是什么?
LPVOID lpFunction;
DWORD dw = (DWORD)lpFunction; // What does it take from LPVOID?
Run Code Online (Sandbox Code Playgroud)
将会有更多的一般性解释.谢谢
我将我的 DLL 注入到一个进程中,然后挂钩这样的函数:(recv)
BOOL HookFunction(LPCWSTR moduleName, LPCSTR funcName, LPVOID funcProxy,
unsigned char* lpBackup)
{
BYTE jmp[6] = { 0xe9,0x00,0x00,0x00,0x00,0xc3 };
DWORD funcAddr = (DWORD)GetProcAddress(GetModuleHandle(moduleName), funcName);
DWORD prev;
VirtualProtect((LPVOID)funcAddr, 6, PAGE_EXECUTE_READWRITE, &prev);
ReadProcessMemory(GetCurrentProcess(), (LPVOID)funcAddr, lpBackup, 6, NULL);
DWORD proxy = ((DWORD)funcProxy - funcAddr) - 5;
memcpy(&jmp[1], &proxy, 4);
memcpy((LPVOID)funcAddr, jmp, 6);
VirtualProtect((LPVOID)funcAddr, 6, prev, &prev);
FlushInstructionCache(GetCurrentProcess(), NULL, NULL);
return funcAddr;
}
// Hook
HookFunction(L"ws2_32.dll", "recv", (LPVOID*)nRecv, hookR);
Run Code Online (Sandbox Code Playgroud)
然后我附加了一个调试器,结果如下:
不过,有几件事我不明白,因为我仍在尝试理解和想象堆栈、堆等如何在调试器中协同工作。
BYTE jmp[6] = { 0xe9,0x00,0x00,0x00,0x00,0xc3 };
Run Code Online (Sandbox Code Playgroud)
我是否在这里替换指令,例如,用 0xe9 替换原始函数的“move, edi, …
我在使用htons将其转换为网络字节之前,通过套接字(c ++客户端)发送端口号(ushort,2个字节).
当使用C#服务器接收时,我正在使用它进行转换,IPAddress.NetworkToHostOrder数字完全不同.
htons(8085) -> 38175 ??
IPAddress.NetworkToHostOrder(38175) -> ??
Run Code Online (Sandbox Code Playgroud)
这是什么原因?
我正在尝试修改线程,而CONTEXT结构不包含Eip.
HANDLE hThread;
CONTEXT ctx;
ctx.ContextFlags = CONTEXT_ALL;
DWORD processId = GetCurrentProcessId();
DWORD mainThreadId = GetMainThreadId(processId);
hThread = OpenThread((THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_SUSPEND_RESUME), FALSE, mainThreadId);
if (hThread)
{
if (GetThreadContext(hThread, &ctx))
{
???ctx.Eip??
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么,尽管它应该.谢谢!