[QUOTE]str=(char *)malloc(100);
str="gskgshdfh"; //运行到这一句时,程序会崩溃.
free(str);
语句p = a 并不能把a的内容复制指针p,而是把a的地址赋给了p。而把一个常量的地址,赋给一个新开辟的空间的地址,会有内存错误. p已经指向了一块内存,而a是已经存在的内存.
[/QUOTE]
哪家的理论????
是不是延迟控制一下呢
这样改了还是有问题,p所指的空间是动态申请的,再函数内部FREE掉,STR变为野指针,再printf时会得到预料之外的结果
#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;
}
那问题就出在 子函数 display() 中
void display(char *str)
{
str=(char *)malloc(100); //动态分配100个字节的内存空间,并将首地址值传给str
str="gskgshdfh"; //运行到这一句时,系统会开辟一块内存空间,将"gskgshdfh"存放进去,然后将str指向常量字符串"gskgshdfh",问题就出在这里
free(str); //这一句的作用不是释放刚才动态分配的内存,而是释放"gskgshdfh"所占的内存空间
getch();
}
所以这段子程序每调用一次,就会吃点100个字节的内存空间。
完毕