我一直试图寻找以下代码失败的原因,我找不到一个.请原谅我的无知,让我知道这里发生了什么.
#include<stdio.h>
int main(void){
char* p="Hi, this is not going to work";
scanf("%s",p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我创建了一个指针p到内存大小为29 + 1的连续区域(对于\ 0).为什么我不能使用scanf来改变它的内容?
PS请纠正我如果我说char*有问题.
小智 14
char* p="Hi, this is not going to work";
Run Code Online (Sandbox Code Playgroud)
这不会为你分配内存
这会创建一个每次尝试更改其内容时都会产生的String Literal结果Undefined Behaviour.
使用p作为缓冲为您scanf做这样的事情
char * p = malloc(sizeof(char) * 128); // 128 is an Example
要么
你也可以这样做:
char p[]="Hi, this is not going to work";
Run Code Online (Sandbox Code Playgroud)
我猜你真的想做什么.
请记住,这仍然可能最终是UB因为scanf()不检查您使用的地方是否确实是有效的可写内存.
记得:
char * p 是一个字符串文字,不应修改
char p[] = "..."分配足够的内存来保存String内部"..."并且可以更改(我的意思是它的内容).
编辑:
要避免的一个好方法UB是
char * p = malloc(sizeof(char) * 128);
scanf("%126s",s);
Run Code Online (Sandbox Code Playgroud)
p指向一个常量字面值,它实际上可能驻留在只读存储区中(取决于实现).无论如何,试图覆盖它是未定义的行为.即它可能导致什么都没有,或者立即崩溃,或者隐藏的内存损坏,这会导致更晚的神秘问题.不要那样做.