这是未定义的行为吗?
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()
。
所以我只想问一下,添加注释行时这是未定义的行为吗?虽然没有编译错误,而且他们都给出了相同的答案。我想知道有什么区别。地址是否被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()
。