【问题标题】:Is this an undefined behaviour?这是未定义的行为吗?
【发布时间】:2016-02-26 08:22:59
【问题描述】:

所以我只是想问一下,当添加注释行时,这是一种未定义的行为。尽管没有编译错误,并且它们都给出了相同的答案。我想知道有什么区别。地址是否被 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;
}

【问题讨论】:

  • 你有内存泄漏。
  • 请注意,a=malloc(sizeof(int)); a=&amp;c; 也会造成内存泄漏。
  • 无论有没有评论,你的程序都会表现得很糟糕。定义明确,但很糟糕。 :)

标签: c pointers malloc undefined-behavior


【解决方案1】:

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

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

不过,它不是 UB,无论如何都是不好的做法。

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

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

【讨论】:

  • 一般来说覆盖分配的内存很糟糕。如果需要,例如如果我想将 1 个指针(指向结构的指针)分配给另一个指针,它们是否都需要 mallocd 或为一个指针分配内存就足够了? @Sourav Ghosh
  • @ArunSrikanthSridhar 是的,这是个坏主意。等等,在那之前,这是误解的迹象。如果您不需要 mallo 内存,为什么首先要 malloc? :) 你明白了吗?
  • 一般来说,我的问题是分配一个 malloced 内存让它成为任何数据类型,当您想将该内存分配给另一个相同数据类型的内存时,在分配之前必须先 malloced 吗?
【解决方案2】:
b=malloc(sizeof(int));
int c=6;
a=&c;
b=a;

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

没有 UB。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-06-15
      • 2011-08-23
      • 1970-01-01
      • 2023-01-27
      • 2021-11-15
      • 2010-12-22
      相关资源
      最近更新 更多