【问题标题】:Function allocates always to the same address, and the variable doesn't change函数总是分配到同一个地址,变量不变
【发布时间】:2016-02-29 22:37:41
【问题描述】:

函数f 总是将其结果分配到相同的地址,这使得main() 函数总是打印出相同的结果,如何让函数将变量分配到另一个地址和free 它们。

int *f(int a) {
    int b = 2 * a;
    return &b;
}

int main(void) {
    int *p4, *p8;

    p4 = f(4);
    p8 = f(8);

    printf("p4: %i / p8: %i\n", *p4, *p8);
}

【问题讨论】:

标签: c function pointers return memory-address


【解决方案1】:

函数f不分配任何东西,它返回一个自动存储的局部变量的地址。只要b 超出范围,当f 返回时,通过此指针访问数据就会调用未定义的行为。编译器应该能够检测到这样一个愚蠢的错误。

要分配内存,你应该使用malloc:

#include <stdio.h>
#include <stdlib.h>

int *f(int a) {
    int *p = malloc(sizeof(*p));
    if (p != NULL)
        *p = 2 * a;
    return p;
}

int main(void) {
    int *p4 = f(4);
    int *p8 = f(8);

    if (p4 != NULL && p8 != NULL) {
        printf("p4: %i / p8: %i\n", *p4, *p8);
    }
    free(p4);
    free(p8);
    return 0;
}

【讨论】:

  • 对于 OP,需要一个“和free他们”。部分。
  • @chux:确实,free 分配的所有内存都是很好的做法,尽管在程序退出时并不严格要求。
  • OP 是familiar 接受。考虑It's okay. Once.
【解决方案2】:

你必须将 b 声明为静态矿石更好,在 f 函数中声明 b 作为参数。你可以这样做

static bool f(int a,int *b)
{
    if(NULL == b)
    {
        return false;
    }
    *b = a * 2;
    return true;
}

最好编写不返回任何内容(void)或布尔值的函数,让您知道一切是否正常,并使用指针修改数据并减少堆栈的使用。大多数安全关键标准都采用此规则。

【讨论】:

  • 这些选项都没有解决 OP 的问题:如何让函数将变量分配到另一个地址并释放它们。
  • 同意检测分配成功或失败是件好事。然而,我在“安全关键标准”方面的经验完全不允许内存分配。
  • 因为他只需要一个变量,所以没有理由使用 malloc() 并因此使用 free(),所以我发布了一个可能的(简单)解决方案来解决他的问题,不需要使用函数之前提到过。来自 MISRA/C:“规则 20.4(必需):不得使用动态堆内存分配。”
猜你喜欢
  • 2021-12-18
  • 2015-09-30
  • 1970-01-01
  • 2020-02-06
  • 2019-08-07
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多