9
回答
c语言中,为什么char *p="abcd"; p="efgh"; //可以。char *p="abcd"; scanf("%s", p)//不可以
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

c语言中,

为什么

char *p="abcd";

 p="efgh"; //可以。

char *p="abcd";

 scanf("%s", p)//不可以?

<无标签>
举报
静溪泛舟
发帖于3年前 9回/844阅
共有9个答案 最后回答: 3年前

因为 char *p="abcd";  没有给分配空间,直接指向了一个常量,

 p="efgh"; 这一句还是没分配空间,只是指向的地址换了个地方

char *p="abcd"; 这一句p指向了 "abcd"这个常量的地址,而这个地址可能是0x12345678,也可能是0x87654321,但是这个地址里面的内容"abcd"是不可修改的

 scanf("%s", p)   这一句企图修改p指向的"abcd",所以报错

可以改成这样 char p[] = "abcd"; scanf("%s",p); 这样应该就可以了

这一句的意思是 给p申请5个字节的空间, "abcd" 还有'\0'加起来的大小, 声明一个常量 "abcd",然后复制给p指向的地址,这样后一句输入语句就能修改p指向的空间了,但是如果输入长度大于5,可能会溢出

char *p="abcd";

 scanf("%s", p)//不可以?   p指向的是一个常量,修改常量会gua的。

你硬要用p可以这样写:

char *p = (char*) malloc (32);  //先分配内存

scanf ("%s", p);

,,,

free(p);

我总感觉标准库的scanf很容易误导人. 由于是标准输入 参数中没有文件指针.  加上标准IO库的缓冲区对用户是透明的.  无法直接访问缓冲区.  使得结果会让人感到困惑.


老师,我想了解一下c编译器对内存空间的管理原理的书籍,能不能给个链接,最好是pdf的,英文版的也行?谢谢你的解答!

引用来自“-水水-”的评论

因为 char *p="abcd";  没有给分配空间,直接指向了一个常量,

 p="efgh"; 这一句还是没分配空间,只是指向的地址换了个地方

char *p="abcd"; 这一句p指向了 "abcd"这个常量的地址,而这个地址可能是0x12345678,也可能是0x87654321,但是这个地址里面的内容"abcd"是不可修改的

 scanf("%s", p)   这一句企图修改p指向的"abcd",所以报错

可以改成这样 char p[] = "abcd"; scanf("%s",p); 这样应该就可以了

这一句的意思是 给p申请5个字节的空间, "abcd" 还有'\0'加起来的大小, 声明一个常量 "abcd",然后复制给p指向的地址,这样后一句输入语句就能修改p指向的空间了,但是如果输入长度大于5,可能会溢出

老师,我想了解一下c编译器对内存空间的管理原理的书籍,能不能给个链接,最好是pdf的,英文版的也行?谢谢你的解答!

引用来自“-水水-”的评论

因为 char *p="abcd";  没有给分配空间,直接指向了一个常量,

 p="efgh"; 这一句还是没分配空间,只是指向的地址换了个地方

char *p="abcd"; 这一句p指向了 "abcd"这个常量的地址,而这个地址可能是0x12345678,也可能是0x87654321,但是这个地址里面的内容"abcd"是不可修改的

 scanf("%s", p)   这一句企图修改p指向的"abcd",所以报错

可以改成这样 char p[] = "abcd"; scanf("%s",p); 这样应该就可以了

这一句的意思是 给p申请5个字节的空间, "abcd" 还有'\0'加起来的大小, 声明一个常量 "abcd",然后复制给p指向的地址,这样后一句输入语句就能修改p指向的空间了,但是如果输入长度大于5,可能会溢出

引用来自“静溪泛舟”的评论

老师,我想了解一下c编译器对内存空间的管理原理的书籍,能不能给个链接,最好是pdf的,英文版的也行?谢谢你的解答!

其实这里还没有涉及到编译器对内存的分配,可能你对指针还不是很熟练,多了解了解指针,有些问题自然而然就就解决了,可能初学者对指针很是困惑,但是C语言的精髓就在这里了,平常多练习,大家都是这么过来的

这样,先给你一个指针的链接  一共62页

http://wenku.baidu.com/view/cdd4e637a32d7375a41780f3.html?re=view

然后有一本书叫<<C指针与缺陷 >> 挺经典的

这里全是C的书籍,你自己挑着看

http://bestcbooks.com/categories/c


这有一本 C和指针

http://bestcbooks.com/B00163LU68/

--- 共有 1 条评论 ---
静溪泛舟谢谢老师 3年前 回复

引用来自“PYPlus”的评论

我总感觉标准库的scanf很容易误导人. 由于是标准输入 参数中没有文件指针.  加上标准IO库的缓冲区对用户是透明的.  无法直接访问缓冲区.  使得结果会让人感到困惑.


哈,一直劝学校的小朋友,printf可以用,scanf不要用。。。。read,fread,至少还知道是什么。。。
顶部