C语言中的功能指针和内存管理

时间:2014-08-29 15:03:39

标签: c pointers function-pointers

这是我有一个问题的程序:

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

int * function1(int);
int * function2(int);

int main(void)
{
    int * result1,* result2;
    int val = 1000;
    result1 = function1(val);
    fprintf(stderr,"result1 = %d\n", *result1);
    result2 = function2(val);
    fprintf(stderr,"result2 = %d\n", *result2);
    fprintf(stderr,"result1 = %d\n", *result1);
}

int * function1(int val)
{
    int result = val + 1500;
    return &result;
}

int * function2(int val)
{
    int result = val - 1500;
    return &result;
}

因此result1最初设置为2500,result2为-500。但是,代码在初始化后没有触及result1,但它从2500更改为其他内容。任何人都可以给我任何暗示,为什么会发生这种情况?

4 个答案:

答案 0 :(得分:3)

从函数返回后,result的内容将不再可用,因为局部变量在堆栈上分配(并在函数返回后“弹出”)。


尝试使用malloc / calloc动态分配内存:

int * function1(int val)
{
    int *result = malloc(sizeof(int));
    *result = val + 1500;
    return result;
}

答案 1 :(得分:2)

result是您的两个函数中的自动局部变量。一旦函数终止,它将不再存在。返回指向自动局部变量的指针无效 编译器应该发出警告:

[Warning] function returns address of local variable [enabled by default]

一种可能的解决方案是您可以将result声明为

static int result;  

然后你可以返回它的指针。


注意:代码中没有函数指针。

答案 2 :(得分:2)

结果变量仅在本地范围内可用。

你可以做的是:

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

int * function1(int);
int * function2(int);

int main(void)
{
    int * result1,* result2;
    int val = 1000;
    result1 = function1(val);
    fprintf(stderr,"result1 = %d\n", *result1);
    result2 = function2(val);
    fprintf(stderr,"result2 = %d\n", *result2);
    fprintf(stderr,"result1 = %d\n", *result1);
    free(result2);
    free(result1);
}

int * function1(int val)
{
    int *result = malloc(sizeof(int));
    *result = val + 1500;
    return result;
}

int * function2(int val)
{
    int *result = malloc(sizeof(int));
    *result = val - 1500;
    return result;
}

因此,通过这种方式,您将始终在变量中获得结果。

答案 3 :(得分:2)

result变量在function1function2中具有块范围。 因此,在执行function1function2后,result变量不再存在。