int main ()
{
char *destination;
char source[10] = "jigarpatel";
destination = (char*) malloc(5);
memcpy(destination, source, 10);
printf("%s and size is %d", destination, strlen(destination));
free(destination);
return 0;
}
输出:
jigarpatel and size is 10
问题:
这里我只分配了5个字节到目的地,但目的地长度是10,这是为什么?
其他字节存储在哪里?
嵌入式系统安全吗?是否有崩溃或分段错误的可能性?
我怎样才能发现这类错误?
另一个问题:
看我正在写一个用户要求所需内存的库,库说要分配10个字节&然后用户malloc 10字节&将其指针传递给库。现在库存储了一些数据...现在看看库是否说要分配10个字节但是用户只分配了5个字节&将该指针指向库,然后我如何检测该用户没有malloc充足的内存。
答案 0 :(得分:5)
这里我刚刚只分配了5个字节到目的地然后为什么目的地长度是10?
printf("%s and size is %d",destination,strlen(destination));
strlen()
将\0
视为字符串的结尾,因此它会继续计数,直到它发现\0
为止。这并不意味着destination
分配了那么多内存。
您正在超出已分配内存的范围进行编写,幸运的是它不会崩溃,但确实是未定义行为。未定义的行为意味着任何事情都可能发生。行为无法解释,幸运的是你的程序不会崩溃。
其他字节存储在哪里?
其他字节会覆盖超出分配给destination
的5个字节的其他内存分配。
嵌入式系统安全吗?任何崩溃或分段错误的机会?
不安全。它会导致未定义的行为,如果幸运的话,它会起作用。
如何检测此类错误?
每个平台都有一些内存分析工具,如Linux / Unix的 Valgrind ,你可以使用它们,并指出这些内存超量。
答案 1 :(得分:4)
这有时会发生,但在任何系统上都绝对不安全。你正在写malloc
给你的结尾。从C的角度来看它是非法的,但从操作系统的角度来看它可能没问题(内存可能被分配了足够的权限)。
另一个问题是,如果您稍后再次调用malloc
,它可能会给您一些内存,包括您正在使用的5个字节而不询问。这应该提供一些interesting debugging个会话。
这里我只分配了5个字节到目的地然后仍然为什么 目的地长度是10。?
目标只分配了5
个字节,但由于malloc在您的系统上的工作方式,这不会导致写入无效,因为它恰好位于有效页面内。
存储其他字节。?
在前5名之后,暂时。
嵌入式系统是否安全?任何崩溃或分割的机会 故障。?
在任何系统中都不安全。很多崩溃的机会。
我怎样才能发现这类错误。?
使用valgrind或任何内存调试器。可以找到对valgrind的温和介绍here.
¹
例如,在Linux(Glibc)上,小的(~64字节)malloc
请求来自称为“fastbins”的一小部分预分配页面。每个fastbin具有固定的大小,因此使用直到该大小的分配的fastbin不会触发分段违规。有关如何发生这种情况的详细信息可以here,找到,以便更严格地处理您可能会引用的主题the malloc source code.
子>
答案 2 :(得分:1)
不,它不安全 - 写入超出已分配块的末尾通常会导致堆损坏。
使用valgrind等工具来捕获此错误和其他类型的错误。
答案 3 :(得分:0)
幸运的是它没有崩溃。 memcpy的第三个参数应为4,然后你应该将空字符放在5位置以终止字符串。