来自 电脑系统 2019-12-23 07:03 的文章
当前位置: 金沙澳门官网网址 > 电脑系统 > 正文

python如何获取dll中的内存地址,致C语言初学者

dll中的c函数doublea[256];extern"C"__declspec(dllexport)intgetAddr(double**pArr){*pArr=a;//传递回double数组a指针return0;}python代码:fromctypesimport*dll=cdll.LoadLibrary('xxx.dll')//如何定义一个double数组指针,并传递该指针地址?dll.getAddr(?)//调用dll函数参数应该怎么写?//调用dll函数后怎样使用传回的地址?

在论坛里经常见到一些新人对指针提出一些问题,作为一个经历过许多错误后的新手,我想把自己的经历说出来,避免让后来人继续这样的错误。
在讲解指针之前,需要理解一下内存空间。内存是随机存取器,计算机上电后便利用内存进行运转。其有一定的容量,为了标识每个存储单元的位置,我们为内存设置了内存地址。内存的具体组织结构可以参考计算机组成原理。
指针是一种指向某种类型的特殊的型别。一般用*定义。如int*p,这样就定义了一个指向int类型的指针。指针用于指向某块内存空间,该内存空间里面存放了其所指向的内存地址。所以,在使用指针之前,必须明白这指针指向了什么内存空间,给指针赋值可以使用取地址符,如p=&a;每次需要访问指针所指向的内容时,便使用解引用符号*进行访问。如:printf(“%d”,*p);
上面简单介绍了下指针的定义,赋值等操作。下面介绍下一些新手容易迷糊的地方吧。
1.char*str1=”abcd”;charstr2[]=”abcd”;的区别
C标准没有规定这两种定义字符串的方式的差别。但是,指针类型的字符串一般不允许修改。如:str1[0]金沙澳门官网网址 ,=’c’;这样的语句会导致运行时错误。错误类型:不允许写入什么的。据说,在某些编译器中可以设置成可以修改的。
2.指针/数组作为参数进行传递
在C语言中,参数是使用值传递的。
intfunc;当调用者调用该函数的时候将传递一个值给a,这个a只是你传递进去的参数的一个副本。而数组传递的时候,会退化为指针,其将数组的首地址复制给形参。看下面的一个例子。

C/C++ code?

1234567891011 voidfun(charstr[]) { printf("Aftertransform:%dn",sizeof; } intmain(){ charstrs[]="abcdefg"; printf("Beforetransform:%dn",sizeof; fun; return0; }

输出:
Beforetransform:8
Aftertransform:4

在传递之前,我们可以获得数组所占用的内存空间的大小;而传递后,我们只能获得一个指针的大小了。

许多初学C指针的同学想在函数内部修改作为参数传递进来的指针的值。看以下代码。

C/C++ code?

12345678910111213141516171819202122 typedefstructLink_Node{ intElem; structLink_Node*next; }LinkNode,*PLinkList; voidCreateList(LinkNode*header) { inti=0; header=(LinkNode*)malloc(sizeof); header->Elem=10; header->next=NULL; } intmain() { PLinkListhead=NULL; CreateList; if(head!=NULL) printf("%dn",head->Elem); free; return0; }

许多人疑惑为什么没有输出呢?请各位谨记:C语言使用值传递进行参数传递。这就是问题所在。在传递指针的时候,调用者传递了原指针所指向的内存地址给形参。也就是说,在传递参数的时候,系统定义了另外一个指针,也就是我们在此定义的header指针。我们把原指针的值传递给了header指针。所以header指向了本例中的null。然后我们去修改header所指向的值。当函数结束后,这个指针的生命周期也结束了。所以对main函数中的head没有任何修改。
下面我们再看一例。

C/C++ code?

12345678910111213141516171819 voidTrans(int*Arr,intnLength) { for(inti=0;i<nLength;i++) Arr[i]+=i+20; } intmain() { intnArr[5]={0}; inti; printf("Before:n"); for(i=0;i<5;i++) printf("%d",nArr[i]); Trans; printf("nAftern"); for(i=0;i<5;i++) printf("%d",nArr[i]); return0; }

本文由金沙澳门官网网址发布于电脑系统,转载请注明出处:python如何获取dll中的内存地址,致C语言初学者

关键词: