我正在将应用程序从x86移植到x64.我正在使用Visual Studio 2009; 大多数代码都是C++,有些部分是纯粹的C.在编译x64时我们不支持__asm关键字,而我们的应用程序包含一些内联汇编程序.我没有写这段代码所以我不确切知道应该做什么:
int CallStackSize() {
DWORD Frame;
PDWORD pFrame;
__asm
{
mov EAX, EBP
mov Frame, EAX
}
pFrame = (PDWORD)Frame;
/*... do stuff with pFrame here*/
}
Run Code Online (Sandbox Code Playgroud)
EBP是指向当前函数堆栈的基指针.有没有办法在不使用内联asm的情况下获取堆栈指针?我一直在关注微软提供的内在函数作为内联asm的替代品,但我找不到任何能给我带来帮助的东西.有任何想法吗?
安德烈亚斯询问用pFrame做了什么.这是完整的功能:
int CallStackSize(DWORD frameEBP = 0)
{
DWORD pc;
int tmpint = 0;
DWORD Frame;
PDWORD pFrame, pPrevFrame;
if(!frameEBP) // No frame supplied. Use current.
{
__asm
{
mov EAX, EBP
mov Frame, EAX
}
}
else Frame = frameEBP;
pFrame = (PDWORD)Frame;
do
{
pc = pFrame[1];
pPrevFrame …Run Code Online (Sandbox Code Playgroud) 我期待以下两个向量在RAM中具有相同的表示:
char a_var[] = "XXX\x00";
char *p_var = "XXX";
Run Code Online (Sandbox Code Playgroud)
但奇怪的是,f(char argument[])如果我调用它,对类型库函数的调用会破坏正在运行的应用程序f(p_var).但使用还f(a_var)可以!
为什么?
我有一个包含函数指针的C结构.现在,我在C中使用了这个设置没有问题,但现在我在Objective-C中使用这个C结构,我需要传递一个在Objective-C类中定义的函数(或选择器)指针.
1.这是我对Objective-C选择器所需要的,它需要作为指向C函数的指针传递:
- (void)myObjCSelector:(int*)myIntArray
{
// Do whatever I need with myIntArray
}
Run Code Online (Sandbox Code Playgroud)
2,这里是我碰壁,在Objective-C的我想选择通过作为指针到C函数调用:在地方的" myObjCSelectorPointer "我需要正确的语法通过选择作为这个C函数调用中的函数指针:
passObjCSelectorPointerToCContext(cContextReference, myObjCSelectorPointer);
Run Code Online (Sandbox Code Playgroud)
我确实调查了这个问题,但主要可以找到几种不同的方法来做类似的事情,但我找不到任何特定的调用C函数和传递Objective-C选择器指针.
在我的应用程序中,我将经常传递对静态字符串的引用.我希望避免Go为每次调用分配内存,但是我没有将地址输入到我的字符串文字中.
为什么不能获取字符串文字的地址(参见test1()下面的例子)?我是否误解了语法,或者由于Go的内部工作原因这是一个限制?
如果不可能,最好的解决方案是什么?
test2()有效,但var hej每次都会分配内存吗?
test3()不会分配任何新的内存,但我希望避免功能之外的混乱.
package main
import "fmt"
var konnichiwa = `???????`
// Gives the compile error `cannot take the address of "Hello world"`
func test1() (*string) { return &`Hello world` }
// Works fine
func test2() (*string) {
hej := `Hej världen`
return &hej
}
func test3() (*string) { return &konnichiwa }
func main(){
fmt.Println(*test1())
fmt.Println(*test2())
fmt.Println(*test3())
}
Run Code Online (Sandbox Code Playgroud)
感谢帮助!
我正在做(可能是错误的)假设它是依赖于实现和/或系统的.是否有类似INT_MAX或CHAR_BIT的东西会告诉我内存中指针的大小?
首先,问题是:CLR规范是否保证在同一进程中的多个应用程序域中执行的代码将共享相同的地址空间?通过"共享地址空间",我的意思是指向在一个应用程序域中分配的内存的指针对于在同一进程内托管的所有应用程序域中进行读写是有效的.
请考虑这个自包含的示例来说明问题:程序Worker在单独的应用程序域中分配对象.该Worker分配10000个整数一个内存块,并用数据填充进去.然后,程序调用app域边界以获取指向已分配块的指针,并验证它是否可以读取10,000个项目中的每一个.
using System;
using System.Reflection;
using System.Runtime.InteropServices;
namespace crossapp {
public class Worker : MarshalByRefObject {
private readonly IntPtr myData;
public const int DataLength = 10000;
public Worker() {
Console.Error.WriteLine(
"Memory allocation happens in app domain '{0}'"
, Assembly.GetExecutingAssembly().FullName
);
myData = Marshal.AllocHGlobal(sizeof(int) * DataLength);
unsafe {
var ptr = (int*) myData.ToPointer();
for (var i = 0 ; i != DataLength ; i++) {
ptr[i] = 2*i + 1;
}
}
}
public IntPtr GetData() …Run Code Online (Sandbox Code Playgroud) 给定以下结构:
type Exp struct {
foo int,
bar *int
}
Run Code Online (Sandbox Code Playgroud)
在结构中使用指针或值时,性能方面有何不同.是否有任何开销或只有两个Go编程学校?
我会使用指针来实现一个链式结构,但这是我们必须在结构中使用指针以获得性能的唯一情况吗?
PS:在上面的结构中我们讨论一个简单的int但它可以是任何其他类型(甚至是自定义的)
例如:
void func1(){
int i = 123;
func2(&i);
}
void func2(int *a){
*a = 456;
}
Run Code Online (Sandbox Code Playgroud)
当func1调用func2,一个指向局部变量传递到func2-指针指向堆栈.这对C的规则是否安全?
谢谢.
我是编程新手.我正在学习C作为我的第一门编程语言.我发现一些奇怪的东西要理解.
我已经知道在C中我们可以将String表示为像这样的字符序列(使用char数组):
char status[10] = "Married";
Run Code Online (Sandbox Code Playgroud)
我已经了解到这种方法的问题是我们必须status在编译期间告诉数组的大小.
但是现在我已经知道我们可以使用char指针来表示string 类似 -
char status[10] = "Married";
char *strPtr;
strPtr = status;
Run Code Online (Sandbox Code Playgroud)
我不理解它.我的问题是 -
我怎样才能在索引4(即我在Married)中使用strPtr?
在数组表示的末尾status有一个空字符(\0)- - - - - - - .因此,通过使用null字符(),我们可以理解字符串的结尾.当我们使用时,我们怎样才能理解结束?stringcharMarried\0\0strPtrstring