C 指针递增是否会导致内存泄漏?

C 指针递增是否会导致内存泄漏?,c,pointers,memory-management,C,Pointers,Memory Management,以下代码是否包含字符串中前三个字符的内存泄漏 char * str = (char*)malloc(21 * sizeof(char)); strcpy(str, "01234567890123456879"); str = str + 3; free(str); 谢谢。这比泄漏更糟糕,你不应该在没有从malloc或realloc/calloc返回指针的情况下调用free。你可能会漏水,或者撞车,或者谁知道还有什么。。。您所做的是未定义的行为。它比泄漏更糟糕,您不应该使用未从malloc或re

以下代码是否包含字符串中前三个字符的内存泄漏

char * str = (char*)malloc(21 * sizeof(char));
strcpy(str, "01234567890123456879");
str = str + 3;
free(str);
谢谢。

这比泄漏更糟糕,你不应该在没有从malloc或realloc/calloc返回指针的情况下调用free。你可能会漏水,或者撞车,或者谁知道还有什么。。。您所做的是未定义的行为。

它比泄漏更糟糕,您不应该使用未从malloc或realloc/calloc返回的指针调用free。你可能会漏水,或者撞车,或者谁知道还有什么。。。您所做的是未定义的行为。

是的,它会泄漏

free需要malloc/realloc/calloc返回的指针。既然你改变了,它肯定会泄漏。

是的,它会泄漏


free需要malloc/realloc/calloc返回的指针。由于您已经更改,它肯定会泄漏。

您可能希望通过测试来证明这一点,但我相信您的问题的答案是,增加指针可能会导致未定义的行为,尽管您看到内存泄漏

我这样说是因为在您的示例中,似乎没有任何地方保留了指向已分配内存的原始指针。如果指针指向的不是基地址,free可能会做错误的事情

当然你需要

1查看系统上正在使用的RAM,尽可能少地运行其他内存

2运行程序几次,然后

3然后再看看内存使用情况

然后按如下方式更改代码,再次尝试所有这些操作:

char * mem_ptr = (char*)malloc(21 * sizeof(char));
char * str = mem_ptr;

strcpy(str, "01234567890123456879");
str = str + 3;
free(mem_ptr);

您可能希望通过测试来证明这一点,但我相信您的问题的答案是,增加指针可能会导致未定义的行为,尽管您看到内存泄漏

我这样说是因为在您的示例中,似乎没有任何地方保留了指向已分配内存的原始指针。如果指针指向的不是基地址,free可能会做错误的事情

当然你需要

1查看系统上正在使用的RAM,尽可能少地运行其他内存

2运行程序几次,然后

3然后再看看内存使用情况

然后按如下方式更改代码,再次尝试所有这些操作:

char * mem_ptr = (char*)malloc(21 * sizeof(char));
char * str = mem_ptr;

strcpy(str, "01234567890123456879");
str = str + 3;
free(mem_ptr);

只是想澄清一下,该规范将其定义为未定义的行为。猴子会飞出你的USB端口!只是想澄清一下,该规范将其定义为未定义的行为。猴子会飞出你的USB端口!它的未定义行为不是内存泄漏。将不正确的指针传递给free是错误的。但程序仍然泄漏?我理解为什么对未定义的行为进行区分。它可能会显示为泄漏,但它仍然没有定义。如果你幸运的话,它会立即崩溃,所以我认为你不能说它肯定会泄漏。也不难想象一个一致的实现会设法释放内存,例如,如果它出于某种奇怪的原因忽略了指针的底部两位,可能是由于对齐字大小的内存访问在体系结构上的工作方式。这个特定的实现不会泄漏,所以我想你也不能说它肯定会泄漏。可以肯定的是,它不能保证不会泄漏。将不正确的指针传递给free是错误的。2.但是程序仍然泄漏?在1之后,程序不再是有效的C程序,因此推测2的行为毫无意义。它未定义的行为不是内存泄漏。将错误的指针传递到空闲是错误的。但程序仍然泄漏?我理解为什么对未定义的行为进行区分。它可能会显示为泄漏,但它仍然没有定义。如果你幸运的话,它会立即崩溃,所以我认为你不能说它肯定会泄漏。也不难想象一个一致的实现会设法释放内存,例如,如果它出于某种奇怪的原因忽略了指针的底部两位,可能是由于对齐字大小的内存访问在体系结构上的工作方式。这个特定的实现不会泄漏,所以我想你也不能说它肯定会泄漏。可以肯定的是,它不能保证不会泄漏。将不正确的指针传递给free是错误的。2.但是程序仍然泄漏?,在1之后,程序不再是有效的C程序,因此推测2的行为毫无意义。