关于内存的面试题
2015-08-23 17:07
393 查看
1、
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void get(char *s)
{
s = (char *)malloc(100);
}
int main()
{
char *ptr = NULL;
get(ptr);
strcpy(ptr, "hello");
printf("%s", ptr);
getchar();
return 0;
}系统崩溃,函数不能传递动态指针,此函数还存在内存泄露的问题。 改变一级指针需要传递二级指针地址
2、#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *get()
{
char str[] = "hello";
return str;
}
int main()
{
char *ptr = NULL;
ptr = get();
printf("%s", ptr);
getchar();
return 0;
}
可能乱码,get()返回栈内指针,该指针不为空,但其原来的内容已经被清空,新内容是未知的,
3、#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void get(char **p, int num)
{
*p = (char *)malloc(num);
}
int main()
{
char *ptr = NULL;
get(&ptr, 100);
strcpy(ptr, "hello");
printf("%s", ptr);
free(ptr);
getchar();
return 0;
}
顺利输出hello ,传递指针的地址,可以改变指针。 虽然用free释放,但是还需要ptr = NULL
4、
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *str = (char *)malloc(100);
strcpy(str, "hello");
printf("%s\n",str);
free(str);
if(str != NULL)
{
strcpy(str, "hello");
printf("%s\n",str);
}
getchar();
return 0;
}
输出
hello
hello
free(str)后指针仍然指向原来的堆地址,即你仍然可以继续使用,但很危险,因为操作系统已经认为这块内存可以使用,他会毫不考虑的将他分配给其他程序,于是你下次使用的时候可能就已经被别的程序改掉了,这种情况就叫“野指针”,所以最好free()了以后再置空
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void get(char *s)
{
s = (char *)malloc(100);
}
int main()
{
char *ptr = NULL;
get(ptr);
strcpy(ptr, "hello");
printf("%s", ptr);
getchar();
return 0;
}系统崩溃,函数不能传递动态指针,此函数还存在内存泄露的问题。 改变一级指针需要传递二级指针地址
2、#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *get()
{
char str[] = "hello";
return str;
}
int main()
{
char *ptr = NULL;
ptr = get();
printf("%s", ptr);
getchar();
return 0;
}
可能乱码,get()返回栈内指针,该指针不为空,但其原来的内容已经被清空,新内容是未知的,
3、#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void get(char **p, int num)
{
*p = (char *)malloc(num);
}
int main()
{
char *ptr = NULL;
get(&ptr, 100);
strcpy(ptr, "hello");
printf("%s", ptr);
free(ptr);
getchar();
return 0;
}
顺利输出hello ,传递指针的地址,可以改变指针。 虽然用free释放,但是还需要ptr = NULL
4、
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *str = (char *)malloc(100);
strcpy(str, "hello");
printf("%s\n",str);
free(str);
if(str != NULL)
{
strcpy(str, "hello");
printf("%s\n",str);
}
getchar();
return 0;
}
输出
hello
hello
free(str)后指针仍然指向原来的堆地址,即你仍然可以继续使用,但很危险,因为操作系统已经认为这块内存可以使用,他会毫不考虑的将他分配给其他程序,于是你下次使用的时候可能就已经被别的程序改掉了,这种情况就叫“野指针”,所以最好free()了以后再置空
相关文章推荐
- 黑马程序员_反射中常用的方法笔记小结
- 一道hadoop面试题
- 黑马程序员--面向对象设计
- 【黑马程序员】ARC机制介绍及使用
- 黑马程序员----Java多线程
- 黑马程序员----Java内存问题
- 黑马程序员------Java深度之—关于 hashCode() 你需要了解的 3 件事
- 面试精选:链表问题集锦 转
- 黑马程序员—————Java基础----集合(二)set、map等
- 秒杀多线程第一篇——多线程笔试面试题汇总
- 黑马程序员--Java基础学习(IO流及字符编码)第二十一天
- 黑马程序员--Java基础学习(IO流--File对象和Properties)第二十天
- 【黑马程序员】重写构造方法实现两种功能
- iOS开发工程师面试知识点汇总
- 【黑马程序员】autorelease用法
- 黑马程序员-------Java笔记--------怎么越过泛型检查
- 【剑指offer】面试题39:深度二叉树
- 黑马程序员----集合框架的的基本操作
- iOS单例模式(面试必考)
- 黑马程序员-------Java笔记--------分数基本运算