首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Visual图像中创建一个const char **

在Visual图像中创建一个const char **
EN

Stack Overflow用户
提问于 2021-02-19 18:12:19
回答 2查看 77关注 0票数 2

我应该如何创建一个(const **)来将它传递给一个C函数?

假设我的const char **命名为prompts,那么:

代码语言:javascript
复制
user := 'User:' copyToHeap: #malloc:.    
pwd := 'Password:' copyToHeap: #malloc:.
prompts := (ByteArray new: 64) copyToHeap: #malloc:.
prompts copyAt: 0 from: (user referentAddress asByteArraySize: 32) size: 4 startingAt: 1.
prompts copyAt: 31 from: (pwd referentAddress asByteArraySize: 32) size: 4 startingAt: 1.

因此,prompts是一个64位数组,其中前32位是指向user的指针,secods 32位是指向pwd的指针。

但是C函数不起作用。在GemStone中,可以使用:

代码语言:javascript
复制
prompts := CByteArray gcMalloc: 16.
user := CByteArray withAll: 'User:'.
pwd := CByteArray withAll: 'Password:'.
prompts uint64At: 0 put: user memoryAddress.
prompts uint64At: 8 put: pwd memoryAddress.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-20 08:27:26

DLLCC提供了一些非常接近C的API。您需要一个由两个字符指针组成的数组。

代码语言:javascript
复制
prompts := CIntegerType char pointerType gcMalloc: 2.

然后,您可以像这样填充这个数组:

代码语言:javascript
复制
prompts at: 0 put: user.
prompts at: 1 put: pwd.

请注意,索引与C类似,类似于prompts[0]=user; prompts[1]=pwd;

最后一件事,所有你的malloc,你必须然后free,否则你会得到内存泄漏。

这意味着您应该更好地使用一些

代码语言:javascript
复制
["your protected code here"]
    ensure: [prompts free. user free. pwd free]`

...or更糟..。

代码语言:javascript
复制
["your protected code here"]
    ensure:
        [prompts isNil ifFalse: [prompts free].
        "etc..."]`.

在早期开发中,我建议您最好使用gcMallocgcMalloc:

后思考

gcMallocuserpwd来说可能不是一个好主意。

这是因为prompts将获得包含在userpwd对象中的内存地址的副本:它将指向相同的内存区域,但不会指向Smalltalk对象.

gcMalloc只监视Smalltalk对象的垃圾收集。因此,如果Smalltalk对象不被更多地使用,C堆可能会过早地被释放,尽管其他一些对象指向同一个C堆.

示例:

代码语言:javascript
复制
fillPrompts
    | user pwd prompts |
    user := 'User:' copyToHeap: #gcMalloc:.    
    pwd := 'Password:' copyToHeap: #gcMalloc:.
    prompts := CIntegerType char pointerType gcMalloc: 2.
    prompts at: 0 put: user.
    prompts at: 1 put: pwd.
    ^prompts

copyToHeap:创建一个CPointer对象。只要该方法是活动的,它的上下文就指向这些对象(堆栈上的槽)。

但是在返回此方法后,没有任何对象指向CPointer对象。

如果发生了一些垃圾回收,它们与C堆的关联指针将被释放。

但是prompts仍然包含对已经释放的内存的引用(所谓的悬空指针)。

DLLCC与C非常接近,在编写C代码时必须采取同样的谨慎措施.对于绝大多数C程序员来说,双指针是bug的来源。

票数 2
EN

Stack Overflow用户

发布于 2021-02-20 09:26:46

您不应该直接处理字节。这在C中根本没有意义。

  1. 用两个char*成员创建一个结构,这样更容易声明、创建和处理。
  2. 使用#gcCalloc#gcCopyToHeap来在堆上分配内存,而堆上的内存仍然是自动释放的。通常,使用这些方法是安全的,因为您只需要将单个方法中的内存传递给C。假设c-函数复制这个内存本身,以防以后需要它。
  3. ,您可以使用#memberAt:put:将成员分配给struct.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66282875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档