复制char指针内容的功能在打印第二个副本索引时崩溃

时间:2013-10-01 20:02:41

标签: c string pointers malloc

我在将char指针指向的内容复制到另一个时遇到问题,即使我在使用 strcpy 之前为其分配了内存。我已经看到了 strdup 的somy建议,但我想知道如何做而不需要它。这是我的主要代码

int main (void)
{
    char word[20];
    leaftype destiny;
    while(1)
    {
        printf("\nType in a word: ");
        scanf("%s",word);
        copy_leaf(&destiny,palavra);
        if (palavra[0] == '0') break;
    }

    system("pause");

    return 0;
}

我遇到的问题是使用copy_leaf函数:

void copy_leaf(leaftype* destiny, leaftype source)
{
    printf("\n====start of copy_leaf======\n");
    int i;
    printf("strlen of source: %d",strlen(source));
    printf("\nsource: ");
    for(i = 0; i <= strlen(source); i++)
    {
        if(i == strlen(source))
        {
            printf("\\0");
        }
        else printf("%c-",source[i]);
    }
    *destiny = malloc((strlen(source)+1)*sizeof(char));
    strcpy(*destiny,source);
    printf("\nstrlen of destiny: %d",strlen(*destiny));
    printf("\ndestiny: ");
    for(i = 0; i <= strlen(*destiny); i++)
    {
        if(i == strlen(*destiny))
        {
        printf("\\0");
        }
        else printf("%c-",*destiny[i]);
    }
    printf("\n===end of copy_leaf======\n");
}

leaftype定义为:

typedef char* leaftype;

当我运行带有“example”一词的代码作为输入时,我进入控制台:

Type in a word: 
====start of copy_leaf======
strlen of source: 7
source: e-x-a-m-p-l-e-\0
strlen of destiny: 7
destiny: e-

它在Windows 7上崩溃(“program.exe已停止工作等”)。我正在使用devcpp,但我的文件以C扩展名命名。任何人都可以帮我修复这个char *到char *内容副本吗?我需要一个函数来实现,因为我需要在我的C文件中多次将一个字符串的内容复制到另一个字符串。提前谢谢!

p.s。:我已经在 copy_leaf 功能(绝望的解决方案)中尝试过:

  • 叶型来源更改为 const叶型来源(即 const char *来源
  • 制作 * destiny = strcpy(* destiny,source),因为strcpy返回指向目标字符串的指针

3 个答案:

答案 0 :(得分:4)

你不应该使用*destiny[i],但是你需要在这一行中使用(*destiny)[i]

    else printf("%c-",(*destiny)[i]);
BTW,命运是双指针,我认为你真的不需要双指针。

答案 1 :(得分:1)

printf("%c-",*destiny[i]);

destiny是char **,[]优先于*。

因此,这被解释为:

printf("%c-",*(destiny[i]));

当你真正想要的时候:

printf("%c-", (*destiny)[i]);

即。当你真正想要第一个(也是唯一的)指针的第i个元素时,你正在读第i个指针的第一个元素。

答案 2 :(得分:0)

为什么我喜欢这样? 这些是要做的以下更正。

 void copy_leaf(leaftype* destiny, leaftype source)

更改为

void copy_leaf(leaftype destiny, leaftype source)

destiny = malloc((strlen(source)+1)*sizeof(char));

strcpy(destiny,source);


for(i = 0; i < strlen(destiny); i++)
    {
        printf("%c-",destiny[i]);


    }

顺便说一句,strcpy的正确原型应该是源数据应该始终是const char *。