strcpy函数传递了一个未初始化的空指针c。

3

我正在尝试以下代码:

int main()
{
   char *yo = "yo";
   char *whaddup = NULL;
   strcpy(whaddup,yo);
}

当我传入一个空指针时,程序发生段错误。作为一个完全的C语言新手,其他地方说我应该将whaddup初始化为一个数组。为什么我不能传递一个空指针?


你不能执行 char *whaddup = NULL; *whaddup ='a';的原因与 int *whaddup = NULL; *whaddup = 4;相同。 - user253751
@immibis 是什么原因,请问? - user2635088
一个空指针不指向任何东西。 - user253751
@immibis 但我们可以这样做char *in = NULL; in = fgets(you.first_name, 100, stdin);,其中you是某个结构体。这是否意味着我们可以给变量in分配一个指针,使其指向其他地方,但不能指向字面值? - user2635088
当你将非NULL的值赋给in后,它就不再包含NULL。如果我执行int in = 5; in = 4;,那么在这个语句运行之后,in包含的是4,而不是5。in = something;*in = something;是不同的——后者不会修改in - user253751
3个回答

3

任何strcpy的文档都会告诉你,目标字符串应该是一个足够大的char数组,能够容纳该字符串和NUL结束符。

所以你需要像这样的内容:

char* yo = "yo";
char* whaddup = malloc(strlen(yo)+1);
strcpy(whaddup, yo);

或者您可以使用strdup函数,它可以为您完成此操作,但它不是标准的,因为它只适用于POSIX。


我只包含了 sizeof(char) 来演示概念上的内存分配,但是没有问题,@user2635088,一个字符就是一个字节,所以你不需要它。当你开始分配整型、双精度等时,养成使用它的习惯是安全的。 - Jack Ryan

1

你需要将whaddup声明为字符数组或者最好使用malloc分配空间。

int main()
{
   char *yo = "yo";
   char *whaddup = malloc(sizeof(char) * 8); // buffer for 8 characters
   strcpy(whaddup,yo);
}

通过将whaddup初始化为NULL,您没有在内存中给它分配空间,因此即使将一个字符复制到其中,也会导致分段错误。

0

你可以传递一个指向空的指针,但你不能从指向空的指针复制字符串。

函数 char* strcpy(char* dest, const char* src) 是将地址 src 处的字符串复制到地址 dest 处,而你的 destnull


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接