我在将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 功能(绝望的解决方案)中尝试过:
答案 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 *。