关于fprint和指针的一些问题

时间:2015-09-08 15:55:00

标签: c pointers operating-system printf

我正在参加操作系统课程,我对以下代码有一些疑问

#include <stdio.h>
int * addition(int a, int b){
    int c = a + b;
    int *d = &c;
    return d;
}
int main(void){
    int result = *(addition(1,2));
    int *result_ptr = addition(1,2);
    /*never interchange */
    printf("result = %d\n", *result_ptr);
    printf("result = %d\n", result);
    return 0;
}
//this code outputs 3
                    3

以下是我交换printfs时发生的情况,实际上第二个只打印出一个随机地址

#include <stdio.h>
int * addition(int a, int b){
    int c = a + b;
    int *d = &c;
    return d;
}
int main(void){
    int result = *(addition(1,2));
    int *result_ptr = addition(1,2);
    /*never interchange */
    printf("result = %d\n", result);
    printf("result = %d\n", *result_ptr);
    return 0;
}
//this code outputs 3
                    and a random address

但是,如果我把它们变成一个printf

#include <stdio.h>
int * addition(int a, int b){
    int c = a + b;
    int *d = &c;
    return d;
}
int main(void){
    int result = *(addition(1,2));
    int *result_ptr = addition(1,2);
    /*never interchange */
    printf("result = %d %d \n", result, *result_ptr);
    return 0;
}
//this code outputs 3 3

我想知道printf是否清除了内存以致指针变得危险?

1 个答案:

答案 0 :(得分:3)

问题出在您的addition功能中。您正在返回本地变量的地址。因为本地生存在堆栈中,所以当函数返回时,该变量的内存超出了范围。这导致了未定义的行为,例如您所经历的行为。

为了使其正常工作,您需要使用malloc

在堆上分配内存
int *addition(int a, int b){
    int *d = malloc(sizeof(int));
    *d = a + b;
    return d;
}

当此函数返回时,您需要确保free完成后返回的指针。否则,您将发生内存泄漏。

相关问题