有一些问题C.我有这个是我的代码:
// First line works, second line does not!
char outbuf[1024];
// char *outbuf = (char *) malloc(1024); // char is always 1
我将这个outbuf传递给在NSS库中声明的名为PK11_CipherOp()
的方法。可以找到此方法的文档here,您可以看到它需要一个char *
的outbuf参数。
我无法理解为什么第一行可靠地工作,第二行不能!
要查看完整代码,请参阅File Source
谢谢,
汉密尔顿
答案 0 :(得分:3)
您的问题似乎是malloc
的遗漏声明 - 您尚未加入<stdlib.h>
。
这意味着您的编译器假设函数返回int
,然后将其显式转换为(unsigned char *)
。如果你在sizeof(int) != sizeof(void *)
的平台上,比如x86-64,那么这将破坏指针值。
这完全说明了为什么在C(不像C ++)中你应该不强制转换malloc()
的结果 - 这样做是不必要的,并且隐藏了这个确切的错误。它还说明了为什么要启用编译器警告。
修复方法是#include <stdlib.h>
,并在您出现时从malloc()
移除广告。
<强>附录:强>
您的另一个问题是您将sizeof(outbuf)
传递给PK11_CipherOp()
。当out_buf_size
是数组时,这将是正确的(等于outbuf
),但当outbuf
是指针时,它是不正确的(指针本身的大小)
将每个sizeof(outbuf)
替换为out_buf_size
,您应该好好去(之后还有另一个)......
答案 1 :(得分:0)
发现了这个问题。事实证明我使用sizeof(outbuf)
作为参数之一。当在堆栈上声明outbuf时,如char outbuf[1024];
这返回1024.但是,当outbuf在堆上时,如char * outbuf = malloc(1024);
outbuf的大小只有4.这个参数告诉函数有多少空间在outbuf中可用,因此函数认为它只有4个字节的空间。它需要16来做任何所以它只是返回而不执行任何工作。