猿问

指针指向问题

程序如下

#include "stdio.h"

#include "string.h"

void main()

{

char s1[40],d[40],*p,*q;

p=s1;

q=d;

printf("input a string:");

gets(s1);

while(*q++=*p++);

puts("destination string:");

puts(q);

}

问题:while(*q++=*p++);执行到*p将‘\0’赋值给*q时,然后p,q都向后移动一位,请问这不是溢出了吗,此时p,q应该移出了s1,d数组的范围?

reuse
浏览 1567回答 3
3回答

Power12138

*q++应该是先取值后移位,再者就是s1[40]可以存储40个字符,包括\0,如果你直接写入的字符串为40,那么这个数组就会溢出,因为\0要存储到数组中,p只是个指针变量,说白了就是一个存储地址的,在地址中存储数据是可以的,不用考虑数组溢出的情况,还有就是while之后,如果存入了39个字符,40为\0,那么p,q都指向41的位置,只要保证数组正常的访问,不影响的,puts(q)这句话是错误的,q已经指向了41的位置了,应该是puts(d);

qq_追梦_26

这不叫溢出 数组是有大小的,也就是说数组有越界情况,而指针只是指向一个内存地址,如果没有人为的控制他是没有界限的,也就是说while(*q++ = *p++)如果p所指向一片连续的地址中如果内存中所存储的数不是0他会一直循环(这是非常危险的),说白了指针就是内存地址的别名,好比一个箱子,你往里面放水果,如果你自己不控制水果的数量一直往里面添加水果箱子肯定会装不下的。多说一句:你定义的哪两个大小为40的数组他们是有界限的超过40会出现未定义和数组下标越界的情况。
随时随地看视频慕课网APP
我要回答