关于 fprint 和指针的一些问题
Some issue concerning fprint and pointers
我正在参加 OS 课程,我对以下代码有一些疑问
#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清空了内存导致指针危险了?
问题出在您的 addition
函数中。您正在返回局部变量的地址。因为局部变量存在于堆栈中,所以当函数 returns 时,该变量的内存超出范围。这导致了未定义的行为,例如您所经历的。
为了使其正常工作,您需要使用 malloc
:
在堆上分配内存
int *addition(int a, int b){
int *d = malloc(sizeof(int));
*d = a + b;
return d;
}
当此函数returns时,您需要确保free
完成后返回的指针。否则,你会发生内存泄漏。
我正在参加 OS 课程,我对以下代码有一些疑问
#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清空了内存导致指针危险了?
问题出在您的 addition
函数中。您正在返回局部变量的地址。因为局部变量存在于堆栈中,所以当函数 returns 时,该变量的内存超出范围。这导致了未定义的行为,例如您所经历的。
为了使其正常工作,您需要使用 malloc
:
int *addition(int a, int b){
int *d = malloc(sizeof(int));
*d = a + b;
return d;
}
当此函数returns时,您需要确保free
完成后返回的指针。否则,你会发生内存泄漏。