>>栈区
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int* func() {
int a = 10;//栈上创建的变量
return &a;
}
void test01() {
int* p = func();
//结果早已不重要,因为上面的a早已被释放,再去操作这块内存属于
//非法操作
printf("%d\n", *p);//10
printf("%d\n", *p);//1907599
}
//栈区
char* getString() {
char str[] = "hello world";
return str;
}
void test02() {
char* p = NULL;
p = getString();
printf("p = %s\n", p);//p = 烫烫烫烫烫烫h鱏
}
int main() {
test01();
test02();
return 0;
}
>>栈区注意事项:
不要返回局部变量的地址,局部变量在函数体执行完毕过后会被释放,再次操作就是非法操作,结果未知!“
>>堆区
- 利用malloc讲数据创建到堆区
- 利用free将堆区数据释放
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//堆区
//利用malloc讲数据创建到堆区
//利用free将堆区数据释放
int* getSpace() {
int* p = malloc(sizeof(int) * 5);
if (p == NULL) {
return NULL;
}
for (int i = 0; i < 5; i++)
{
p[i] = 100 + i;
}
return p;
}
void test01() {
int* p = getSpace();
for (int i = 0; i < 5; i++) {
printf("%d\n", p[i]);
}
//释放堆区数据
free(p);
p = NULL;//防止p是一个野指针
}
int main() {
test01();
system("pause");
return EXIT_SUCCESS;
}
2、请问程序以下的输出结果是什么呢?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//堆区注意事项
void allocateSpace(char* pp) {
char* temp = malloc(100);
memset(temp, 0, 100);
strcpy(temp, "hello world");
pp = temp;
}
void test02() {
char* p = NULL;
allocateSpace(p);
printf("%s\n", p);
}
int main() {
test02();
system("pause");
return EXIT_SUCCESS;
}
3、正确的输出hello world
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void allocateSpace(char** pp) {
char* temp = malloc(100);
memset(temp, 0, 100);
strcpy(temp, "hello world");
*pp = temp;
}
void test03() {
char* p = NULL;
allocateSpace(&p);
printf("p2 = %s\n", p);
}
int main() {
test03();
system("pause");
return EXIT_SUCCESS;
}
- 利用 malloc 将数据创建到堆区
- 利用 free 将堆区数据释放~
>>堆区注意事项:
- 如果给主调函数中 一个空指针分配内存,利用同级的指针是分配失败的
- 解决方式:利用高级指针修饰低级指针