| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2369 人关注过本帖
标题:[求助] c语言笔试题
只看楼主 加入收藏
eakcon
Rank: 1
等 级:新手上路
帖 子:754
专家分:0
注 册:2007-11-7
收藏
得分:0 
好程序
2007-11-07 12:12
nearforest
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2007-11-7
收藏
得分:0 
str=(char *)malloc(100);
str="gskgshdfh"; //运行到这一句时,程序会崩溃.
free(str);




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

共同进步.
2007-11-07 16:55
iFreeBSD
Rank: 4
等 级:业余侠客
威 望:4
帖 子:474
专家分:236
注 册:2007-11-5
收藏
得分:0 

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


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

哪家的理论????


without further ado, let’s get started
2007-11-07 17:03
holylyj
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2007-9-27
收藏
得分:0 

是不是延迟控制一下呢

2007-11-07 17:15
viwa
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-11-7
收藏
得分:0 
以下是引用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时会得到预料之外的结果

2007-11-07 17:26
wenbin171
Rank: 1
等 级:新手上路
帖 子:119
专家分:0
注 册:2007-11-6
收藏
得分:0 

不懂


-------哼!谁说不可以-------
2007-11-07 17:48
qq95620412
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-11-5
收藏
得分:0 

#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;
}


人生路难走,转眼已白头。伤心望远山,黯然下小楼。
2007-11-07 18:49
qq95620412
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-11-5
收藏
得分:0 

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

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


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

完毕


人生路难走,转眼已白头。伤心望远山,黯然下小楼。
2007-11-07 18:57
michael086
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2007-7-17
收藏
得分:0 
不懂

2007-11-07 20:24
kr_zHaYj
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2007-10-31
收藏
得分:0 
go on !!!
2007-11-07 21:02
快速回复:[求助] c语言笔试题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024299 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved