我正在尝试以下代码:
int main()
{
char *yo = "yo";
char *whaddup = NULL;
strcpy(whaddup,yo);
}
当我传入一个空指针时,程序发生段错误。作为一个完全的C语言新手,其他地方说我应该将whaddup
初始化为一个数组。为什么我不能传递一个空指针?
任何strcpy
的文档都会告诉你,目标字符串应该是一个足够大的char
数组,能够容纳该字符串和NUL
结束符。
所以你需要像这样的内容:
char* yo = "yo";
char* whaddup = malloc(strlen(yo)+1);
strcpy(whaddup, yo);
或者您可以使用strdup
函数,它可以为您完成此操作,但它不是标准的,因为它只适用于POSIX。
sizeof(char)
来演示概念上的内存分配,但是没有问题,@user2635088,一个字符就是一个字节,所以你不需要它。当你开始分配整型、双精度等时,养成使用它的习惯是安全的。 - Jack Ryan你需要将whaddup
声明为字符数组或者最好使用malloc
分配空间。
int main()
{
char *yo = "yo";
char *whaddup = malloc(sizeof(char) * 8); // buffer for 8 characters
strcpy(whaddup,yo);
}
whaddup
初始化为NULL
,您没有在内存中给它分配空间,因此即使将一个字符复制到其中,也会导致分段错误。你可以传递一个指向空的指针,但你不能从指向空的指针复制字符串。
函数 char* strcpy(char* dest, const char* src)
是将地址 src
处的字符串复制到地址 dest
处,而你的 dest
是 null
。
char *whaddup = NULL; *whaddup ='a';
的原因与int *whaddup = NULL; *whaddup = 4;
相同。 - user253751char *in = NULL; in = fgets(you.first_name, 100, stdin);
,其中you
是某个结构体。这是否意味着我们可以给变量in
分配一个指针,使其指向其他地方,但不能指向字面值? - user2635088in
后,它就不再包含NULL。如果我执行int in = 5; in = 4;
,那么在这个语句运行之后,in
包含的是4,而不是5。in = something;
和*in = something;
是不同的——后者不会修改in
。 - user253751