字符串副本(strcpy)

时间:2012-10-21 09:27:32

标签: c string strcpy

我有以下代码。

#include <string.h>
#include <stdio.h>

int main()
{
char * l;
*l = 'c';
*(l+1) = 'g';
*(l+2) = '\0';

char *second;
strcpy(second, l);
printf("string: %s\n", second);
}

当我跑步时说:
输出显示“分段错误”....任何建议??

由于

3 个答案:

答案 0 :(得分:1)

l是一个未初始化的指针;你不能取消引用它。您应该分配足够的空间来写入其内容(静态(1)或动态(2))。

char l[3]; /* (1) */

#include <stdlib.h>
char *l = malloc(3); /* (2) */

strcpy的错误相同:second是一个单位指针,你不能写入它。

答案 1 :(得分:0)

您将学习鄙视Segmentation Fault错误......

当您尝试访问不属于您的内存时,通常会调用它。最常见的情况是当您尝试访问超出范围的数组索引时。

char *l只是创建一个指向char的指针。你想要的是一个字符串,在C中定义为一个字符数组。因此,当您尝试访问内存中l指向的任何位置时(可能只是垃圾),您将访问不属于您的内存,因此Segmentation Fault < / p>

答案 2 :(得分:0)

您可以使用malloc获取内存或将指针指向已存在的变量。

  char word[3];
  char *l;
  l = word;

现在你可以做这样的作业:

  *l = 'c';
  *(l+1) = 'g';
  *(l+2) = '\0';

但是现在你要将它复制到另一个指针,这个指针必须指向另一个字符串,或者你应该为它分配内存。

  char *pointer_to_second;
  char second[3];
  pointer_to_second = second;

或者如果您希望获得动态内存,请将上面的3行更改为以下一行:

  char *pointer_to_second = malloc(sizeof(char) * 3);
之后,你可以做你想做的事:

  strcpy(pointer_to_second, l);

但请记住,如果您使用的是C编译器,则必须在beggining处声明所有变量,否则会出错。如果您使用的是C ++编译器,则不必担心它。

当您尝试访问不属于矢量的字段时,会发生分段错误。例如,如果您尝试这样做:

  printf("The value in position 3 of my pointer is %c\n", *(l + 3));

你可能会收到一个错误,因为你的指针有3个位置而你正试图进入第4个位置。