与C有一些问题。这是我的代码:

// First line works, second line does not!
char outbuf[1024];
// char *outbuf = (char *) malloc(1024);  // char is always 1

我将这个爆发传递给NSS库中声明的一个名为PK11_CipherOp()的方法。这个方法的文档可以找到here,您可以看到它期望outbuf参数为char *
我不明白为什么第一条线工作可靠,而第二条线不可靠!
要查看完整代码,请参见File Source
谢谢,
汉密尔顿

最佳答案

您的问题似乎是缺少malloc的声明-您没有包括<stdlib.h>
这意味着编译器假设函数返回int,然后显式转换为(unsigned char *)。如果您所处的平台sizeof(int) != sizeof(void *),如x86-64,则这将损坏指针值。
这完全说明了为什么在C(不像C++)中,你不应该抛出malloc()的结果——这样做是不必要的,并且隐藏了这个精确的bug。它还说明了为什么应该启用编译器警告。
修复方法是#include <stdlib.h>,并在您在场时从malloc()中移除石膏。
附录:
你的另一个问题是你把sizeof(outbuf)传递给PK11_CipherOp()。当out_buf_size是数组时,这是正确的(等于outbuf),而当outbuf是指针时,这是不正确的(指针本身的大小)。
将每个sizeof(outbuf)替换为out_buf_size应该很好(稍后还有另一个)。。。

关于c - 了解NSS PK11_CipherOp和C内存分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1844778/

10-12 04:51