与 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 参数。

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

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

谢谢,

汉密尔顿

有帮助吗?

解决方案

您的问题似乎是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,你应该是好去(还有另外一个后太)...

其他提示

实测值的问题。原来,我是用sizeof(outbuf)作为参数之一。当outbuf中的堆栈上宣布,作为char outbuf[1024];这将返回1024然而,当outbuf中在堆上,作为char * outbuf = malloc(1024);的outbuf的大小刚好4.此参数告诉功能多少空间是如何在现有的outbuf,所以功能以为它只有4个字节的空间。它需要16做的任何的所以它只是不执行任何工作返回。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top