注册 登录
编程论坛 新人交流区

[求助] c语言笔试题

yinlb1987 发布于 2007-11-05 22:09, 2387 次点击

#include<stdio.h>
void display(char *str);
void main()
{
char *str=NULL;
display(str);
printf("%s",str);

}
void display(char *str)
{
str=(char *)malloc(100);
str="gskgshdfh";
free(str);
getch();

}

请问这个程序有什么问题?

55 回复
#2
一水先生2007-11-05 22:55
让干什么的?
#3
hago2007-11-06 17:15

#include<stdio.h>
#include<alloc.h>
#include<conio.h>
void display(char *str);
void main()
{
char *str=NULL;
display(str);
printf("%s",str);

}
void display(char *str)
{
str=(char *)malloc(100);
str="gskgshdfh";
free(str);
getch();

}
你这个里面的好多函数都不是stdio.h里的
malloc()和free()是alloc.h里的
getch()是conio.h里的
但实在是不知道你的这个程序有什么用途啊。。。

#4
DasayHaoEr2007-11-06 18:33
??
是啊,在主方法里将指针设为NULL,然后再调用display()方法,做什么用?白做了?
#5
xf128393562007-11-06 19:46

#include<stdio.h>
#include<alloc.h>
#include<conio.h>
void display(char *str);
void main()
{
char *str=NULL;
display(str);
printf("%s",str);

}
void display(char *str)
{
str=(char *)malloc(100);
str="gskgshdfh";
free(str);
getch();

}
你这个里面的好多函数都不是stdio.h里的
malloc()和free()是alloc.h里的
getch()是conio.h里的
但实在是不知道你的这个程序有什么用途啊。。。


这位朋友说得对 ``C语言里函数多得很哈 `
用途也多得很````要慢慢积累啊`

#6
wdyllff2007-11-06 19:51

真是搞不懂 啊

#7
yinlb19872007-11-06 20:04

我也是搞不懂啊
面试的时候考官给出来这个题
我当时都晕了

#8
iFreeBSD2007-11-06 20:17

这也算面试题? 自己参见关于存储类一章.

#9
iFreeBSD2007-11-06 20:31
[QUOTE]但实在是不知道你的这个程序有什么用途啊。。。[/QUOTE]
这个程序的用途考你变量的存储类掌握没有.
#10
矿泉水wz2007-11-07 12:10
malloc函数是<stdio.h>中的吗???
#11
eakcon2007-11-07 12:12
好程序
#12
nearforest2007-11-07 16:55
str=(char *)malloc(100);
str="gskgshdfh"; //运行到这一句时,程序会崩溃.
free(str);




语句p = a 并不能把a的内容复制指针p,而是把a的地址赋给了p。而把一个常量的地址,赋给一个新开辟的空间的地址,会有内存错误. p已经指向了一块内存,而a是已经存在的内存.
如果要把a的内容,copy到p,用strcpy(p,a);
#13
iFreeBSD2007-11-07 17:03

[QUOTE]str=(char *)malloc(100);
str="gskgshdfh"; //运行到这一句时,程序会崩溃.
free(str);


语句p = a 并不能把a的内容复制指针p,而是把a的地址赋给了p。而把一个常量的地址,赋给一个新开辟的空间的地址,会有内存错误. p已经指向了一块内存,而a是已经存在的内存.
[/QUOTE]

哪家的理论????

#14
holylyj2007-11-07 17:15

是不是延迟控制一下呢

#15
viwa2007-11-07 17:26
以下是引用nearforest在2007-11-7 16:55:18的发言:
str=(char *)malloc(100);
str="gskgshdfh"; //运行到这一句时,程序会崩溃.
free(str);




语句p = a 并不能把a的内容复制指针p,而是把a的地址赋给了p。而把一个常量的地址,赋给一个新开辟的空间的地址,会有内存错误. p已经指向了一块内存,而a是已经存在的内存.
如果要把a的内容,copy到p,用strcpy(p,a);

这样改了还是有问题,p所指的空间是动态申请的,再函数内部FREE掉,STR变为野指针,再printf时会得到预料之外的结果

#16
wenbin1712007-11-07 17:48

不懂

#17
qq956204122007-11-07 18:49

#include<stdio.h>
void display(char *str);
void main()
{
char *str=NULL;
display(str);
printf("%s",str);
}
void display(char *str)
{
str=(char *)malloc(100);
str="gskgshdfh";
free(str);
getch();
}


首先说明 display()函数中对str的修改并不会引起主函数中str的任何变化。
原因很简单:C在函数调用时参数是采用传值调用的方式。所以
main()函数调用 display()函数时, 只是将str的值复制给display()的对应形参。
这样display()函数在对形参进行修改,并不会引起主函数中变量的变化。
通过这个程序大家应该能很清楚的了解:

void swap(int a,int b){
int temp;
temp=a;
a=b;
b=temp;
}

int main(){
int a=3,b=4;
printf("%d,%d\n",a,b);
swap(a,b);
printf("%d,%d\n",a,b);
return 0;
}

程序运行后的结果是什么:
3,4
3,4

那要想通过函数实现实参的改变,只有通过指针。
正确的程序:

void swap(int *a,int *b){
int *temp;
*temp=*a;
*a=*b;
*b=*temp;
}

int main(){
int a=3,b=4;
printf("%d,%d\n",a,b);
swap(&a,&b);
printf("%d,%d\n",a,b);
return 0;
}


当然大家可以想一想,若将swap改成如下的程序,是否还能达到目的

void swap(int *a, int *b){
int *temp;
temp=a;
a=b;
b=temp;
}

#18
qq956204122007-11-07 18:57

那问题就出在 子函数 display() 中

void display(char *str)
{
str=(char *)malloc(100); //动态分配100个字节的内存空间,并将首地址值传给str
str="gskgshdfh"; //运行到这一句时,系统会开辟一块内存空间,将"gskgshdfh"存放进去,然后将str指向常量字符串"gskgshdfh",问题就出在这里
free(str); //这一句的作用不是释放刚才动态分配的内存,而是释放"gskgshdfh"所占的内存空间
getch();
}


所以这段子程序每调用一次,就会吃点100个字节的内存空间。

完毕

#19
michael0862007-11-07 20:24
不懂
#20
kr_zHaYj2007-11-07 21:02
go on !!!
#21
ouquansi2007-11-07 21:53
C语言,可学习性高啊
#22
nearforest2007-11-08 10:03

to iFreeBSD:

我在VC6.0环境下测试的是这样子. 你的结论是什么? 你用是什

么环境?


to viwa :"这样改了还是有问题,p所指的空间是动态申请的,再

函数内部FREE掉,STR变为野指针,再printf时会得到预料之外的

结果". 我测试的结果也不是这样的.内存无法通过子函数来传递,

所以申请内存成功与否在此处并不起作用.不管Free与否,即使在子函数中存在着泄露问题,在外面str都一直

是NULL. 我在VC6.0环境下测试的.

交流一下大家.

#23
iFreeBSD2007-11-08 15:50

[QUOTE]to iFreeBSD:

我在VC6.0环境下测试的是这样子. 你的结论是什么? 你用是什

么环境?


to viwa :"这样改了还是有问题,p所指的空间是动态申请的,再

函数内部FREE掉,STR变为野指针,再printf时会得到预料之外的

结果". 我测试的结果也不是这样的.内存无法通过子函数来传递,

所以申请内存成功与否在此处并不起作用.不管Free与否,即使在子函数中存在着泄露问题,在外面str都一直

是NULL. 我在VC6.0环境下测试的.

交流一下大家.

[/QUOTE]

我用的FreeBSD,cc编译器.

指针不是存储空间,只是对存储空间的引用.
str = (char *)malloc(100) //只是让str引用一块由malloc()分配的100字节的空间.
字符串 "gskgshdfh" 本身具有静态存储期,即生命周期为当从程序被编译开始到程序结束.
所以:str = "gskgshdfh" 完全合法,即使没有str = (char *)malloc(100)这条语句.
free(str)并不能释放str,str依旧还是引用(指向)"gskgshdfh" . 不信自己在其后加条printf("%#p" ,str);
所以程序不能显示"gskgshdfh"的原因是main()中的str和display()中的str具有完全不同的名字空间.

#24
jeason19792007-11-08 17:18

过来瞧瞧

#25
yinlb19872007-11-08 19:49

不知道大家有没有运行这个程序?

#26
yinlb19872007-11-08 19:55
多些各位
学了部少!
#27
vampr2007-11-08 19:57
malloc函数在alloc.h里面
#28
hustmumu2007-11-08 20:10
不是,是alloc.h里的
#29
zdhcx2007-11-08 21:49
晕... 我都晕了,看不懂,才学了几天!
#30
li笨宝宝2007-11-08 22:29
回复:(yinlb1987)[求助] c语言笔试题
你学的是文件程序不
#31
li笨宝宝2007-11-08 22:35
回复:(li笨宝宝)回复:(yinlb1987)[求助] c语言笔...
这是C程序文件的代码`
是关于存储类的,你自己去参见文件,就知道啦
#32
succubus2007-11-08 22:45

看到那么多人都说要用malloc都得包含<alloc.h>
叹口气先
建议大家还是尽量用标准c
要用malloc的时候还是包含<stdlib.h>文件吧

#33
beachboy2007-11-08 22:47
进来学习
#34
frank2002007-11-08 23:23

#include<stdio.h>
#include<alloc.h>
#include<conio.h>
void display(char *str);
void main()
{
char *str=NULL;
display(str);
printf("%s",str);

}
void display(char *str)
{
str=(char *)malloc(100);
str="gskgshdfh";
free(str);
getch();

}
这个程序运行时会发生错误,free()
出现了问题,这个考官还可以

#35
做人不厚道2007-11-09 03:34
以下是引用zdhcx在2007-11-8 21:49:49的发言:
晕... 我都晕了,看不懂,才学了几天!

#36
做人不厚道2007-11-09 03:36
#37
nianshi2007-11-09 09:31
str=(char *)malloc(100);
表示在内存中开辟一个大小为100个字节的字符数组(假设首地址是:2001),并把2001放入指针str中,此时str指向这个100字节的这数组。

str="gskgshdfh";:
执行完这一句:表示在内存再开辟一个大小为10个字节的字符数组,里面放的串“gskgshdfh”(假设首地址是:2501),并把2501放入str中,此时str指向这个10个字节的字符数组。这样后果:前面开辟的100个字节的数组空间相当于丢失了,或叫内存泄漏,这块空间成了垃圾空间,即无法再访问了,因为唯一指向它的str指针现在已经指向了另外一个10字节的空间。

free(str);
此时再执行释放,因为str中放的是2501,所以释放了是那个10字节的空间,而非那个100字节的空间,实际上那个空间我们已经无法释放了,因为我们已经找不到它了。

说得有些啰嗦,呵呵……
#38
yamingo2007-11-09 11:40
灌水,本不是我的原意!
#39
nearforest2007-11-09 11:52

代码调试观察str值:

void main()
{
char *str=NULL; // 0x00000000
display(str);
printf("%s",str);

}
void display(char *str)
{
str=(char *)malloc(100); //0x00372928
str="gskgshdfh"; //0x00422020
printf("%s",str); //screen:"gskgshdfh"
free(str); //此处死掉
//debug in,死因在_CRTIMP void __cdecl _free_dbg中,如下:
/*
* If this ASSERT fails, a bad pointer has been passed in. It may be
* totally bogus, or it may have been allocated from another heap.
* The pointer MUST come from the 'local' heap.
*/
// _ASSERTE(_CrtIsValidHeapPointer(pUserData));

getch();
}

所以和楼上的意见相同,同iFreeBSD的有出入.呵呵,估计是编译器的原因吗?应该不会.稍后用GCC试试.

#40
nearforest2007-11-09 12:09
to :nianshi

行至水穷处 坐看去起时

用是五笔吧...有空交流一下几个字的打法...比如亨利的heng...
#41
滴滴雨2007-11-09 20:17
3楼,5楼错了吧!
malloc()和free()是malloc.h里的
但getch()就是stdio.h里的啊
#42
jicaifeng2007-11-09 21:06
路过
#43
flyfish3212007-11-09 22:03

大概是测试空间分配,和空间释放吧!

#44
zhaoshijun2007-11-09 23:29
问题在于你的void display(char *str)函数定义在mian()后,要在mian()里调用需先声明!
#45
linjianhai2007-11-09 23:48

不懂哈。

#46
pidig2007-11-10 00:33
恨是
#47
yinlb19872007-11-10 18:17

请问39楼的大侠
如何进行代码调试观察str的值。

#48
forrestx2007-11-12 16:04
我估计他要是要考你,在display中给str分配内存,并赋值,然后在主程序中打印。
这是有问题的。
还记得传值调用,和传址调用吗!这个程序就是一个传值调用,很容易就出错了。
子程序中想改变str指向的内存单元,返回主程序后,str还是NULL,根本打印不出东西来。
#49
YXP_PP2007-11-12 21:03

我也见过这种题,不过还是把自己的想法写了上去,不能达到预期效果.??

#50
lwc862007-11-13 04:13

应该是<MALLOC.H>
你这是有关链表的

#51
寒天雪地2007-11-13 08:18
回复:(qq95620412)那问题就出在 子函数 display() ...
void diplay(char *str)
{ str=malloc(100);
strcpy(str,"gskgshdfh");
printf("cur str is:%s",str);
free(str);
}
这样写行不?
12