我们在Windows 2003服务器上通过COM +运行本机C++应用程序.我最近从事件查看器中注意到它抛出异常,特别是C0000005异常,根据http://blogs.msdn.com/calvin_hsia/archive/2004/06/30/170344.aspx表示该过程试图写入不在其地址空间内的内存,即访问冲突.
事件查看器中的条目提供了一个调用堆栈:
LibFmwk!UTIL_GetDateFromLogByDayDirectory(char const*,class utilCDate&)+ 0xa26c LibFmwk!UTIL_GetDateFromLogByDayDirectory(char const*,class utilCDate&)+ 0x8af4 LibFmwk!UTIL_GetDateFromLogByDayDirectory(char const*,class utilCDate&)+ 0x13a1 LibFmwk!utilCLogController :: GetFLFInfoLevel(void )const + 0x1070 LibFmwk!utilCLogController :: GetFLFInfoLevel(void)const + 0x186
现在,我明白它给我的方法名称去看看,但我感觉每行末尾的地址(例如+ 0xa26c)试图指向我在该方法中的特定行或指令.
所以我的问题是:
编辑:根据要求,这是似乎导致问题的方法:
BOOL UTIL_GetDateFromLogByDayDirectory(LPCSTR pszDir, utilCDate& oDate)
{
BOOL bRet = FALSE;
if ((pszDir[0] == '%') &&
::isdigit(pszDir[1]) && ::isdigit(pszDir[2]) &&
::isdigit(pszDir[3]) && ::isdigit(pszDir[4]) &&
::isdigit(pszDir[5]) && ::isdigit(pszDir[6]) &&
::isdigit(pszDir[7]) && ::isdigit(pszDir[8]) &&
!pszDir[9])
{
char acCopy[9];
::memcpy(acCopy, pszDir + 1, 8);
acCopy[8] = '\0';
int …Run Code Online (Sandbox Code Playgroud) 我想检查我的代码的每一行的地址.我想知道:
我在这里想做什么?使用dumpbin获取信息.
我期待什么?
fun main add:0x0000
var int i add:0x2496
var int j add:0x249A
Run Code Online (Sandbox Code Playgroud)
非常感谢正确解释的适当帮助.
我想打印存储变量的位置.我谷歌它,我发现了这个:
int *p;
printf("memory location of ptr: %p\n", (void *)p);
Run Code Online (Sandbox Code Playgroud)
如果我写这个,是不是?
printf("memory location of ptr: %p\n", &p);
Run Code Online (Sandbox Code Playgroud)
我编译它,我没有得到任何错误或警告,但如果我把它们都放在程序中,这两个语句不会返回相同的值.
看看这段代码:
class Test
{
//
};
Test TestAddress()
{
Test test;
cout << "Object Address in function: " << (int)&test << endl;
return test;
}
int IntAddress()
{
int test;
cout << "Integer Address in function: " <<(int)&test << endl;
return test;
}
int main() {
int x = IntAddress();
cout << "Integer Address in Main: " <<(int)&x << endl;
Test object = TestAddress();
cout << "Object Address in Main: " <<(int)&object << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
功能中的
整数地址:1076679252 …
我知道使用以下方法将矢量"转换"为c样式数组是合法的:
std:vector<char> v;
char *c = &v[0];
Run Code Online (Sandbox Code Playgroud)
对于std :: deque来说也是如此吗?
在golang中,我可以从给定的字符串中打印内存地址的值吗?
例如,如果运行以下代码:
a := "A String"
fmt.Println(&a)
Run Code Online (Sandbox Code Playgroud)
它打印0x1040c108.
我怎么能得到一个字符串,0x1040c108并打印存储在内存中的字符串的值?就像是fmt.Println(*0x1040c108)
这可能吗?
例如,我有以下字符串:
std::string s = "Hello, World!"
Run Code Online (Sandbox Code Playgroud)
我想要的地址中最后一个元素的s它'!'.
我尝试了以下代码,但它似乎没有输出我想要它.
std::cout << &s[s.length() - 1];
Run Code Online (Sandbox Code Playgroud)
那输出'!'不是它的地址,同样的情况发生s.back()
是因为格式化引起的std::cout或其他地方的问题?
基本上我想要一个函数,它输出字符串中最后一个(如果可能的话,第一个)元素的地址.
我正在尝试显示特定地址的内容,给定该地址的char*.到目前为止,我尝试使用以下实现来完成它
int mem_display(char *arguments) {
int address = *arguments;
int* contents_pointer = (int*)address;
int contents = *contents_pointer;
printf("Address %p: contents %16x\n", contents_pointer, contents);
}
Run Code Online (Sandbox Code Playgroud)
但我一直收到"分段错误(Core Dumped)"错误.我试图制作一个虚拟指针来测试
char foo = 6;
char *bar = &foo;
Run Code Online (Sandbox Code Playgroud)
但错误仍然存在
我对C#相当陌生,我有一个问题困扰了我一段时间。
当我学习C#时,我被告知一个类不应包含很多变量,因为那样一来,读取变量(或从中调用方法)会很慢。
有人告诉我,当我访问C#类中的变量时,它将从内存中读取整个类以读取变量数据,但这对我来说听起来很奇怪和错误。
例如,如果我有这个课:
public class Test
{
public int toAccess; // 32 bit
private byte someValue; // 8 bit
private short anotherValue; // 16 bit
}
Run Code Online (Sandbox Code Playgroud)
然后从main访问它:
public class MainClass
{
private Test test;
public MainClass(Test test)
{
this.test = test;
}
public static void Main(string[] args)
{
var main = new MainClass(new Test());
Console.WriteLine(main.test.toAccess); // Would read all 56 bit of the class
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:确实如此吗?访问变量时是否读取了整个类?