前些天面试的时候这道题做错了,面试我的大哥当时给我讲了这题,当时就是“哦哦哦……”的点头,可能由于当时也太紧张,他说什么我也忘了,后来把这题写下来看了很久,感谢etual大哥的热心,最后这题按面试那位大哥的说法我还是有些问题,现记录如下:
void Getmemery(char *p) { p=(char *)malloc(100);
} void main() { char *str=NULL;
Getmemery(str); strcpy(str,"hello world");
printf("%s\n",str);
}
|
题目的意思是要输出 hello world,但是程序里写的有问题。
Getmemery里分配内存空间后,将首地址指给p,即经过函数参数的传递,在Getmemery函数体内有srt的值为这段内存的首地址,但这个值并未返回回来,所以在main函数内,
strcpy(str,"hello world");
这一句str的值仍是0,即其指向的是0开始的内存,而分配的那段内存不知去向。这就肯定得不到想要的结果。
可修改程序如下:
void *Getmemery(void) { char *p; p=(char *)malloc(100); return p; } void main() { char *str=NULL; str = Getmemery(); strcpy(str,"hello world"); printf("%s",str); free(str); getch(); }
|
这样通过指针的传递,str就指向了分配的那段内存。结果正确。
关于以上的问题还可以分析如下程序:
void exchange(int *x,int *y) { int *z; z=x; x=y; y=z; }
void main() { int c=2,d=3;
int *a=&c; int *b=&d;
printf("\nbefore:a=%d,b=%d",*a,*b); exchange(a,b); printf("\nafter:a=%d,b=%d",*a,*b); } 程序输出结果为:a=2,b=3
a=2,b=3
在exchange函数内确实交换了指针x,y的指向,但这个结果是没能返回的,a和b还是没有改变。即a和b是一直指向原来的值的。
|
当时面试的大哥给我讲的是将Getmemery内改成**p,即程序如下:
void Getmemery(char **p) { p=(char *)malloc(100); } void main() { char *str=NULL; Getmemery(str); strcpy(str,"hello world"); printf("%s\n",str); getch(); }
|
但是这样运行得不到想要的结果,若在其中插入一行,即换成如下程序:
void Getmemery(char **p) { p=(char *)malloc(100); } void main() { char *str=NULL; Getmemery(str); strcpy(str,"hello world"); printf("%d\n",str);
printf("%c%c%c%c%c%c%c%c%c%c%c\n",*str,*(str+1),*(str+2),*(str+3),*(str+4),*(str+5),*(str+6),*(str+7),*(str+8),*(str+9),*(str+10));
getch(); }
可得到结果:0
hello world
猜测:str还是在0的地址上,字符串hello world复制到了0开始往下的一段内存中。
printf("%d\n",str);不能输出hello world,还不知道原因。反正果这样的话,str指针指乱了,hello world复制到了一段不希望的内存上,会出问题的。记下问题,以后功力深了再分析……
|
阅读(2049) | 评论(3) | 转发(0) |