【问题标题】:String copy(strcpy)字符串复制(strcpy)
【发布时间】:2012-10-21 09:27:32
【问题描述】:

我有以下代码。

#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);
}

当我运行它时说:
输出显示“分段错误”....有什么建议吗??

谢谢

【问题讨论】:

    标签: c string strcpy


    【解决方案1】:

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

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

    strcpy 也是同样的错误:second 是一个未初始化的指针,你不能写入它。

    【讨论】:

    • 这又引出了另一个问题?如果我有 char * ch;这会自动为我分配一个内存位置来存储一个字符
    • 不,如果你有char *ch,它只是为指向char 的指针分配空间,并且它保持未初始化。如果您想拥有一个角色,请声明char ch
    【解决方案2】:

    你将学会鄙视Segmentation Fault错误...

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

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

    【讨论】:

      【解决方案3】:

      您可以使用 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 编译器,则必须在开始时声明所有变量,否则会出错。如果您使用的是 C++ 编译器,则不必担心。

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

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

      您可能会遇到错误,因为您的指针有 3 个位置,而您正试图访问第 4 个位置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-17
        • 1970-01-01
        • 1970-01-01
        • 2013-02-26
        • 2021-07-19
        • 2016-02-09
        • 1970-01-01
        相关资源
        最近更新 更多