这个功能有什么问题?

时间:2012-02-25 21:16:18

标签: c pointers compiler-construction malloc goto

我猜malloc和goto的关系存在问题。或者,我猜这里有一些内存浪费或内存损坏。希望,有人可以指出我确切的错误。 当我编译它没有给我任何错误,但是,我的大四是坚持我有一个错误。

#define FINISH() goto fini;

BOOL Do()
{

    BOOL stat;
    UINT32 ptr;
    int err;

    ptr = (UINT32)malloc(1000);


    free((void*)ptr);

fini:
    return stat;
}

6 个答案:

答案 0 :(得分:4)

以下是我在代码中发现的问题

  • err != ERROR_SUCCESS此函数泄漏内存时。它会跳过free来电。
  • 您正在将malloc的返回值存储到32位位置。这不是便携式解决方案。在64位平台上,这会对您的程序造成严重破坏,因为您要截断地址。如果你必须使用非指针类型,请使用size_t代替(虽然我会在整数类型上推荐一个指针)
  • 此处未明确指定本地stat。如果err != ERROR_SUCCESS,您将返回垃圾。需要始终为其分配值。最简单的方法是提供默认方式。
  • 您不会检查malloc的返回值,并可能会将隐藏的NULL指针传递到Fun2

这是我建议编辑的功能

BOOL Do()
{

    BOOL stat = FALSE;
    size_t ptr = 0;
    int err;

    ptr = (UINT32)malloc(1000);
    err = Fun1();

    if (err != ERROR_SUCCESS || ptr == 0)
        FINISH();
    else
        stat = Fun2(ptr);

fini:
    free((void*)ptr);
    return stat;
}

答案 1 :(得分:3)

malloc返回一个指针。您正在转换指向整数的指针,但指针和整数不需要具有相同的表示。例如,指针大小可能是64位,并且不适合您的整数。

对象stat也可以在函数中使用not-initialized。如果没有显式初始化,对象stat在声明后会有一个不确定的值。

答案 2 :(得分:1)

我们不知道应该做什么,但如果Fun1()没有返回ERROR_SUCCESS,那么ptr永远不会被释放。据推测,这是你老板所说的错误。

答案 3 :(得分:1)

您正在将指针转换为uint32_t并再次返回。这会擦除指针值的上半部分。

答案 4 :(得分:0)

无论你做什么,你都不是在编译代码。它有语法错误。

if(foo)
  bar;;
else
  baz

检查您的构建系统。

答案 5 :(得分:0)

我的整体评论,以及在C中工作的一般经验法则...如果你必须做指针演员,问问自己:你真的需要吗?你真正需要做指针演员的时间非常罕见。更常见的是当人们使用指针转换时,因为他们在理解上有一些差距,不清楚他们正在尝试做什么或应该做什么,并试图使编译器警告静音。

ptr = (UINT32)malloc(1000);

非常糟糕!如果你对这个“指针”做任何事情,如果它适用于64位平台,你将非常幸运。将指针保留为指针类型。如果你绝对必须将它们存储在整数中,请使用保证足够大的uintptr_t

我说你可能一直在尝试:

// Allocate 1,000 32-bit integers
UINT32 *ptr = (UINT32*)malloc(1000 * sizeof(UINT32));

然而即使这对于C代码来说也是一种糟糕的形式,这是一种奇怪的C和C ++混合。与C ++不同,在C中你只需要void *并隐式将它带到任何指针类型:

// Allocate 1,000 32-bit integers
UINT32 *ptr = malloc(1000 * sizeof(UINT32));

最后,

free((void*)ptr);

施放到void*是另一个大红旗,经常表明作者不知道他们在做什么。将ptr更改为实际指针类型后,只需执行以下操作:

free(ptr);