全局变量和局部变量malloc的区别
时间: 2023-08-06 17:07:58 浏览: 126
全局变量和局部变量在内存中的存储位置是不同的。全局变量存储在静态存储区,而局部变量存储在堆栈中。静态存储区的变量在程序运行期间一直存在,而堆栈中的变量只在函数被调用时才被创建,函数结束时被销毁。
对于malloc函数,它可以在程序运行期间动态分配内存,返回一个指向分配内存的指针。这个指针指向的内存块是在堆(heap)中分配的,它的生命周期不受函数调用的限制,需要手动调用free函数来释放。如果使用malloc分配的内存块没有被释放,就会导致内存泄漏的问题。
相关问题
1.利用fork创建子进程,验证局部变量、全局变量和malloc动态申请的变量在父子进程中的使用情况。
当使用fork创建子进程时,子进程会复制父进程的所有变量和内存空间。因此,局部变量和全局变量在父子进程中的使用情况是不同的。在父进程中修改局部变量的值不会影响子进程中的值,但是修改全局变量的值会影响到子进程中的值。对于malloc动态申请的变量,父子进程都会拥有一个指向同一块内存空间的指针,因此在父进程中修改malloc动态申请的变量的值也会影响到子进程中的值。
1.利用fork创建子进程,验证局部变量、全局变量和malloc动态申请的变量在父子进程中的使用情况。
当使用fork创建子进程时,子进程会复制父进程的内存空间,包括局部变量和全局变量。因此,在子进程中对这些变量的修改不会影响父进程中的值。而对于malloc动态申请的变量,由于它们存储在堆中,因此在子进程中也会复制一份,但是它们的地址会发生改变,因此需要在子进程中重新分配内存。
以下是一个简单的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int global_var = 10;
int main() {
int local_var = 20;
int *heap_var = (int *) malloc(sizeof(int));
*heap_var = 30;
pid_t pid = fork();
if (pid == 0) { // 子进程
printf("Child process:\n");
printf("global_var = %d\n", global_var);
printf("local_var = %d\n", local_var);
printf("*heap_var = %d\n", *heap_var);
global_var = 100;
local_var = 200;
*heap_var = 300;
printf("After modification:\n");
printf("global_var = %d\n", global_var);
printf("local_var = %d\n", local_var);
printf("*heap_var = %d\n", *heap_var);
} else if (pid > 0) { // 父进程
printf("Parent process:\n");
printf("global_var = %d\n", global_var);
printf("local_var = %d\n", local_var);
printf("*heap_var = %d\n", *heap_var);
} else { // fork失败
printf("fork failed!\n");
return -1;
}
free(heap_var);
return 0;
}
```
输出结果为:
```
Parent process:
global_var = 10
local_var = 20
*heap_var = 30
Child process:
global_var = 10
local_var = 20
*heap_var = 30
After modification:
global_var = 100
local_var = 200
*heap_var = 300
```
可以看到,在子进程中对变量的修改不会影响父进程中的值。
阅读全文
相关推荐














