与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/