0

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

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

我将此 outbuf 传递给PK11_CipherOp()在 NSS 库中声明的名为 的方法。可以在此处找到此方法的文档,您可以看到它需要一个char *用于 outbuf 参数。

我不明白为什么第一行可靠地工作,而第二行却不行!

要查看完整代码,请参阅文件源

谢谢,

汉密尔顿

4

2 回答 2

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) ,但当是指针时这是不正确的(指针本身的大小)。outbufoutbuf

将每个替换sizeof(outbuf)out_buf_size,您应该一切顺利(稍后还有另一个)...

于 2009-12-04T04:39:23.350 回答
0

发现问题。原来,我正在使用sizeof(outbuf)作为参数之一。当outbuf在栈上声明时,aschar outbuf[1024];返回1024。然而,当outbuf在堆上时,因为char * outbuf = malloc(1024);outbuf的大小只有4。这个参数告诉函数在outbuf中有多少可用空间,所以函数认为它只有 4 个字节的空间。它需要 16 来做任何事情,所以它只是返回而不执行任何工作。

于 2009-12-04T21:59:39.140 回答