我一直在尝试寻找以下代码失败的原因,但找不到。
所以请原谅我的无知,让我知道这里发生了什么。
#include<stdio.h>
int main(void){
char* p="Hi, this is not going to work";
scanf("%s",p);
return 0;
}
据我了解,我创建了一个指向内存中大小为 29 + 1 的连续区域的指针 p(对于 \0)。
为什么我不能使用 scanf 来更改其中的内容?
P.S 如果我说的有关 char* 的内容有误,请纠正我。
char* p="Hi, this is not going to work";
这不会分配内存供您写入
这创建了一个String Literal
这导致Undefined Behaviour
每次您尝试更改其内容时。
to use p
作为你的缓冲scanf
做类似的事情char * p = malloc(sizeof(char) * 128); // 128 is an Example
OR
你也可以这样做:
char p[]="Hi, this is not going to work";
我猜这就是你真正想做的事情。
请记住,这仍然可能最终成为UB
因为scanf()
不检查您正在使用的地方是否确实是有效的可写内存。
记住 :
char * p
是字符串文字,不应修改
char p[] = "..."
分配足够的内存来保存字符串"..."
并且可能会改变(我的意思是它的内容)。
Edit :
一个值得避免的好技巧UB
is
char * p = malloc(sizeof(char) * 128);
scanf("%126s",s);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)