这是未定义的行为吗?

Is this an undefined behaviour?

所以我只想问一下,添加注释行时这是未定义的行为吗?虽然没有编译错误,而且他们都给出了相同的答案。我想知道有什么区别。地址是否被a的地址覆盖。另外,如果要这样做(即为 b 分配内存),memcpy() 会是一个很好的解决方案。这可能是一个微不足道的例子,但我想了解其中的区别。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int *a;
    int *b;
    a=malloc(sizeof(int));
    //b=malloc(sizeof(int));
    int c=6;
    a=&c;
    b=a;
    printf("%d\n",*b);
    return 0;
}

当您取消注释 //b=malloc(sizeof(int)); 部分时,您最终将创建 memory leak,因为稍后,您将丢失 malloc() 返回的指针并且将无法free()它。

FWIW,您已经遇到了 a 的问题,因为您用 c 的地址覆盖了 malloc()ed 内存。

不是 UB,但是无论如何,这是一种不好的做法。

对于上面的代码,您可以安全地删除两个 malloc()。你不需要它们。

也就是说,int main()至少应该是int main(void),才符合标准。

b=malloc(sizeof(int));
int c=6;
a=&c;
b=a;

由于 b 的值在使用前已更改,因此将 malloc 的 return 值分配给 b 没有任何区别。但是,您没有 free 它,所以您确实泄漏了分配的内存。

没有UB。

我认为这段代码不会导致未定义的行为,但这段代码确实会导致内存泄漏。

如果不需要额外的缓冲区,请不要使用 malloc()