dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以通过这个指针读取它的成员变量吗

问题描述

dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以通过这个指针读取它的成员变量吗

dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以直接通过这个指针读取它的成员变量吗?

解决方案

当然是可以的。但是更好的方式是把分配内存的工作交给调用者去做。因为这样不容易忘记释放内存。申请和释放的代码成对出现。

参考windows api里的GetWindowRect,它由调用者传入一个lpRect结构体指针,函数获取了窗口坐标,填充它。

解决方案二:

只要是在同一个 EXE 内,也就是相同的询址空间内,指针都可以正常访问的。
无论是 DLL 中,还是在哪里。

解决方案三:

你想这么用的话,需要保证两点。

1、你在内部初始化结构体对象时,必须使用malloc或new在堆上分配内存,然后在函数外使用后再释放。否则,你直接构造对象(也就是在栈上分配内存),那么你将返回野指针,这个非常危险。

2、必须保证你动态库外部程序也有相同的结构体声明,否则你指针无法完成转化,也就不能达到你要直接操作的目的了。

另外建议你传递时指针时用通用性指针,别直接用结构体指针,使用时在转化

解决方案四:

只要在同一个进程空间,同时是共享堆等,然后DLL指针在合法生命期,那么就可以访问它的成员变量

解决方案五:

结构体中的指针变量问题
结构体指针内的指针变量成员的内存分配

时间: 2025-01-21 12:06:42

dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以通过这个指针读取它的成员变量吗的相关文章

jna java c++ dll-最近用JNA技术,实现java调用C++的DLL,如何用java模拟c++的链表结构体。

问题描述 最近用JNA技术,实现java调用C++的DLL,如何用java模拟c++的链表结构体. C++结构体 struct CUser_DataStruct { char pKKSCoding[128]; //标签点Kks编码 DWORD time; //UTC时间 WORD millisecond; //毫秒 int nDataState; //数据状态 double dValue; //数值 CUser_DataStruct* pNext; //指向下一个数据节点的指针 }; C++的入

Android开发:程序目录结构详解

  HelloWorld程序的目录结构概述   我们可以在文件夹中看到,HelloWorld程序的目录主要包括:src文件夹.gen文件夹.Android文件夹.assets.res文件夹. AndroidManifest.xml.default.properties.在Eclipse的左侧展开HelloWorld项目,可以看到如下图的目录结构:   开发:程序目录结构详解-">   下面将分节介绍上面的各级目录结构.   1.src文件夹   顾名思义(src, source code)

将指向结构体对象的指针作为函数参数,调用p->时调试报错

问题描述 将指向结构体对象的指针作为函数参数,调用p->时调试报错 void deleteelement(linearlist *list, int power) { linearlist *p = list; while (p->power != power && p->next != NULL) //调试时显示错误在这一行 { p = p->next; } if (p->power == power) { linearlist *dele = p; p =

《Arduino实战》——1.6 Arduino程序的结构

1.6 Arduino程序的结构 一个典型的Arduino程序由两个子程序组成:第一个是初始化子程序,称为setup,第二个子程序通常包括程序的主体,称为loop.下面我们来详细了解一下这两个子程序. 1.6.1 setup子程序 如果你打算出去跑步,在出门之前你得先做一些准备工作:穿上你的运动鞋,拿一瓶水,做一下伸展运动,--.对于Arduino,也是一样的道理.在正式开始工作之前,你需要先做一些准备工作. 这些准备工作在一个叫做setup的初始化子程序或者说是函数中完成(详见代码清单).通常

详解C语言的结构体中成员变量偏移问题_C 语言

c语言中关于结构体的位置偏移原则简单,但经常忘记,做点笔记以是个记忆的好办法 原则有三个: a.结构体中的所有成员其首地址偏移量必须为器数据类型长度的整数被,其中第一个成员的首地址偏移量为0, 例如,若第二个成员类型为int,则其首地址偏移量必须为4的倍数,否则就要"首部填充":以此类推 b.结构体所占的总字节数即sizeof()函数返回的值必须是最大成员的长度的整数倍,否则要进行"末尾填充": c.若结构体A将结构体B作为其成员,则结构体B存储的首地址的偏移量必须

JavaScript程序控制流结构

在任何一种语言中,程序控制流是必须的,它能使得整个程序减小混乱,使之顺利按其一定的方式执行.下面是JavaScript常用的程序控制流结构及语句: 1.if条件语句 基本格式: if(表述式) 语句段1: ...... else 语句段2: ..... 功能:若表达式为true,则执行语句段1:否则执行语句段2. 说明:if -else 语句是JavaScript中最基本的控制语句,通过它可以改变语句的 执行顺序. 表达式中必须使用关系语句, 来实现判断,它作为一个布尔值 来估算的.它将零和非零

c语言-结构体指针数组指向结构体类型数组的问题

问题描述 结构体指针数组指向结构体类型数组的问题 #include<stdio.h> #include<stdlib.h> struct student { char num; char name[10]; int grade; }; void swap(struct student *p[],int n) { int k,m,i,j; struct student *d; k=0;m=n-1; while(k<m) { j=m-1;m=0; for(i=k;i<=j;

【Xamarin挖墙脚系列:Xamarin.IOS的程序的结构】

原文:[Xamarin挖墙脚系列:Xamarin.IOS的程序的结构] 开始熟悉Xamarin在开发IOS的结构!!!!!!!   先看官方   这个是以一个单页面的程序进行讲述的. 1 程序引用的程序集,核心的Xamarin.IOS 程序集,包含了对应版本的API 2 组件   官方商城上的组件 3 资源文件 位图  音频  视频等文件 4 Main.cs  定义程序启动入口 5  AppDelegate.cs 程序启动后,定义窗口容器,并接收来自系统的事件消息. 6 Main.storybo

冒泡排序-关于结构体指针问题。什么时候在指针前面加*号,什么时候不加

问题描述 关于结构体指针问题.什么时候在指针前面加*号,什么时候不加 我在做一道对结构体数组,按姓名升序进行冒泡排序的题的时候有些不理解指针什么时候加"*"什么时候不加*. 下面上我的代码. 结构体定义 typedef struct array{ int a; char b; }Array; 为结构体赋值 Stu student[5] = { {"uioyi",'m',95,58}, {"asdf",'m',88,28}, {"cvb&