C语言以下不正确的程序段是

来源:百度知道 编辑:UC知道 时间:2024/06/06 03:38:24
以下不正确的程序段是_____
A) char str[20]
scanf("%s",&str);
B) char *p;
scanf("%s",p);
C) char str[20];
scanf("%s",&str[2]);
D) char str[20],*p=str;
scanf("%s",p[2]);

能说明原因吗?谢谢。

A选项你可能写错了吧,scanf("%s",&str); 多了个&,不过vc2008中编译也能通过,可能str即代表首地址又代表字符串数组名吧。
B不正确。
char str[20]这种方式定义时,编译器会给它分配具体的地址,比如100-120号地址为str这个字符串所用。
用char *p这种方式定义时,p是指向字符串的地址,这个p指向的地址是随机的,没有给p初始化的话(初始化:p= &str,就是给p赋具体的地址值),那么你再用scanf("%s",p)的话有可能造成危险,因为你给随机的地址赋值了。具体点:因为p的值是随机的,比如他指向的是100号地址,而100号地址又可能是已经被另外一个变量a占用,而你再用scanf赋值的话,那么a又会被你给改写了。总之,使用指针赋值之前先要确定指针所指向的地址,这样:char str[20],*p ; p = &str[0] ; gets(p) ;
D选项中的p定义为常量,所以正确,我也编译过了,能通过无警告。

b是对的吧。
a多了个&,str本身就是地址
c、d类型不配对

错误的是 A,B,D

a

A

同意4楼匿名的,很详细,很好很强大o(∩_∩)o...