面试中碰到的一个malloc和free的题目

crazy1003 2012-12-03 03:08:14
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main ()
{
char * s = (char *)malloc(100);
s = "Hello world!";

free(s);

if(s == NULL)
printf("Hello\n");
else
printf("no\n");

return 0;
}
问,会输出什么,为什么?
先谢谢了
...全文
539 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
ImportantPerson 2012-12-06
  • 打赏
  • 举报
回复
出错 非法访问 程序退出
MoreWindows 2012-12-04
  • 打赏
  • 举报
回复
s = "Hello world!"; 在这里,s指向了常量数据区,所以后面的free(s)会引发程序非常访问,从而被操作系统结束掉。 关于栈,堆,常量数据区,楼主可以看下我写的《C/C++变量在内存中的分布》 http://blog.csdn.net/morewindows/article/details/6851681
sevk 2012-12-04
  • 打赏
  • 举报
回复
windows xp 强大了。。。
C:\Documents and Settings\Administrator>cat f.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main ()
{
        char * s = (char *)malloc(100);
        s = "Hello world!";
        puts(s);
        printf("%02X\n",s);
        free(s);
        puts(s);
        printf("%02X\n",s);

        if(s == NULL)
                printf("Hello\n");
        else
                printf("no\n");

        return 0;
}


C:\Documents and Settings\Administrator>g++ f.c -o f && f
f.c: 在函数‘int main()’中:
f.c:8:13: 警告:不建议使用从字符串常量到‘char*’的转换 [-Wwrite-strings]
Hello world!
403064
Hello world!
403064
no

C:\Documents and Settings\Administrator>g++ -v
使用内建 specs。
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=d:/mingw/bin/../libexec/gcc/mingw32/4.6.2/lto-wrapper.exe
目标:mingw32
配置为:../gcc-4.6.2/configure --enable-languages=c,c++,ada,fortran,objc,obj-c++
 --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp --disa
ble-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-li
bs --build=mingw32 --prefix=/mingw
线程模型:win32
gcc 版本 4.6.2 (GCC)
子善旬 2012-12-04
  • 打赏
  • 举报
回复
面试官拿这种code,是测试脑残的吗???? 在机器上跑下,直接就出问题,很快就能定位了。不值得人工校对。 肯定是国内小公司的面试,就喜欢搞这些无聊的飞机,不如出个算法题,有意义的多。
留翼飞 2012-12-04
  • 打赏
  • 举报
回复
测了一下,什么都输不出,求大神讲解!!!!!
straing 2012-12-04
  • 打赏
  • 举报
回复
通过验证,直接崩了,free之后,S则是一个僵尸指针。
nadleeh 2012-12-04
  • 打赏
  • 举报
回复
输出no, char *s=(char *)malloc(0); 这才爽!
hemmingway 2012-12-04
  • 打赏
  • 举报
回复
这句话就有错误。。

 s = "Hello world!";
xuexingyang 2012-12-04
  • 打赏
  • 举报
回复
脑残面试官+++++
proorck6 2012-12-04
  • 打赏
  • 举报
回复
什么破程序,一个指针指向两个位置,这不出问题才怪呢 具体的运行结果应该是平添相关的吧,不同的编译器会有不同的行为
常如意 2012-12-04
  • 打赏
  • 举报
回复
没必要测试这样的程序
startservice 2012-12-03
  • 打赏
  • 举报
回复
free的时候直接崩掉了。
Binzo 2012-12-03
  • 打赏
  • 举报
回复
"hello world" 字符串的首地址给了s,然后...
_程序员 2012-12-03
  • 打赏
  • 举报
回复
62708807 职业C/C++交流群 以前很火的,后来被群主清空了 现在找人
_程序员 2012-12-03
  • 打赏
  • 举报
回复
会崩溃 你的程序在free(s)之前,指针已经指向一个栈区的内存了,
14号选手 2012-12-03
  • 打赏
  • 举报
回复
程序会崩溃啊 没见过这种写法s="Hello world!"
breakfisher 2012-12-03
  • 打赏
  • 举报
回复
int main ()
{
        char * s = (char *)malloc(100);
        s = "Hello world!"; //s指向一个字符串常量
        free(s); //试图free字符串常量, 会Segmentation fault, 程序终止
        if(s == NULL)
                printf("Hello\n");
        else
                printf("no\n");
        return 0;
}
假如程序是这样的:
char * s = (char *)malloc(100);
        free(s); //free掉s指向的内存空间,但是s并不等于NULL, s还是会指向原来的内存地址,只是那块内存已经free掉了
        if(s == NULL)
          printf("Hello\n");
        else
          printf("no\n"); //最后会输出no
        return 0;
一个比较好的习惯就是每次free(s)后,将s = NULL;
AnYidan 2012-12-03
  • 打赏
  • 举报
回复
引用 3 楼 pengzhixi 的回复:
直接崩溃,释放非堆上的内存。
++
snakedy 2012-12-03
  • 打赏
  • 举报
回复
直接core了,如果溢出到一个可以释放的空间上,也会出"no"的输出
CUMTB_huitailang 2012-12-03
  • 打赏
  • 举报
回复
char * s = (char *)malloc(100); s指向堆中某区域; s = "Hello world!"; s重新指向文字常量区某区域; free(s); 所以程序会奔溃。
加载更多回复(6)
南京大学 计算机专业 历年复试题目 面试.txt Turing Award的获得者的名字以及他们所作出的贡献,3-4个即可(几乎每年必考) 图论,群等比较重要 面向对象的相关概念也是 操作系统的死琐,信号量等等 数据结构的树,散列等等 再准备点例如什么是光电效应、请用一阶逻辑谓词描述Euclidean第5定理、心极限定理得意义、什么是算法等 无环有向简单图最多多少条边。 改错 ×××(int a) { int ab[30]; int *p=ab; if(a%2) p=malloc(sizeof(int)*a); free(p); } agent? uml?? 面向对象如何实现重用?类型和类的区别?在javainterface的实现在c++用什么实现? 海狸啃树木,决定让它们不生育。但是有人认为过去用的迁移更好。请问下列哪个可以用 于反对迁移: (只记得正确答案)海狸迁走的地方往往会有别的地方来的可以生育的海狸 什么是群 环 格 不均匀地绳子,完全燃烧需要一个小时。 现在给你两根绳子,如何做个45分钟地定时器。 如何不用第三个元素,交换两个元素地值 王国维在人间词话提到学习的三个层次 tcp和ip协议分别用于哪个层次 tcp/ip协议包还有什么别的协议? 图灵是哪里人? 图灵奖哪个国家哪个组织颁发? acm的full name ieee的full name 写出0,1交替序列的正则表达式 用英语表达死锁的四个条件,in your own language 基础类 拉格朗日定理 管程的定义 四个原语操作 hanson方法的特点 网格计算的定义
面试题,是纸上写的,发现了些错误,回来改进了下。写纸上和写计算机里并编译成功完全是两个效果。 开始没太多字符串操作,很繁琐、难点也多,后逐渐改进。 典型问题1: sizeof()局限于栈数组 char a[] = "asd213123123"; 形式,并且这种不能用'\0'判断是否结束(这种判断方式能很方便加在while条件用于判断越界——b != '\0')。 如果是字符串常量: char *b = "dasadafasdf"; 这种情况,sizeof()就废掉了! 总之: 对号入座,前者sizeof、后者strlen~!不过sizeof(a)和strlen(b)还有另外一个区别,strlen不计算'\0',而sizeof要计算(前提是sizeof()不针对char指针) 典型问题2: 用什么来暂存并输出结果?还是只是记录下来相关位置——这是我底下未完成版本1想到的思路——用一个count[sizeof(A)]数组记录下A每个位置作为起点所能和B达到的最大重合,最后判断查找数组最大值,此时目标子字符串的起点下标(i)和 i 对应的长度(counter[i])都有了。 这是针对不知道字符串大小并且不占用额外空间的做法,需要非常繁琐的操作,要加很多标记,越界判断也会有些麻烦(结合优势么,用字符串常量而不是栈空间的字符数组,有'\0'——就好判断了!) (关于空间的占用,如果要用一个和字符串a一样长的数组counter来计录a各起点对应与b最大重合子字符串,这个数组也要和a一样长,空间上也不合适,除非情形很特殊,a短b长,不然不如直接malloc()一个堆空间来储存当前最长“子字符串”,并实时更新) 先放一个改完编译测试成功的。 release1 //题目:要求比较A字符串(例如“abcdef"),B字符串(例如(bdcda)。找出重合度最大的子字符串,输出(根据OJ经验,输>出结果对即可) #include #include #include main(){ char *A = "abcderfghi"; char *B = "aderkkkkkabcd"; int i,j,c = 0,count = 0; unsigned int maxSeg = 0; int max = strlen(A) > strlen(B) ? strlen(A) : strlen(B); char* final = (char*)malloc(sizeof(char) * (max + 1)); final[max] = '\0'; for(i = 0;A[i] != '\0';i++){ for(j = 0;B[j] != '\0';j++){ while(A[i + c] == B[j] && A[i+c] != '\0' && B[j] != '\0'){ count++; c++; j++; }                         if(count > maxSeg){                                 strncpy(final,(A + i),count);                                 maxSeg = count;                         } count = 0; c = 0; } } printf("%s\n",final); free(final); } 这是能将就用的第一个版本~!关于结束符'\0'能否影响free()的使用,觉得是完全不用操心的,因为malloc的大小是系统来保存的,删除时候系统来接手就完了,而'\0'结束符只是针对一些常规字符串操作,比如printf()用%s控制输出时~! 新难点:找到的子字符串同时一样长怎么办?那我这只能叫做”第一个最长的重合字符串“用两块空间来存储?三

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧