strcpyを使用する前にメモリを割り当てているにもかかわらず、 char ポインターが指すコンテンツを別のポインターにコピーする際に問題が発生しています。strdupでいくつかの提案を見てきましたが、それを必要とせずに何をすべきか知りたいです。これが私のメインコードです
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");
}
リーフタイプは次のように定義されます。
typedef char* leaftype;
入力として「例」という単語を含むコードを実行すると、コンソールに表示されます。
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ファイルである文字列の内容を別の文字列に何度もコピーする必要があるため、それを行う関数が必要です。前もって感謝します!
ps: copy_leaf関数で既に試したこと (絶望的な解決策):
- leaftype ソースをconst leaftypeソースに変更します(これはconst char* sourceになります)
- *destiny = strcpy(*destiny,source)を作成します。これは、strcpy が宛先文字列へのポインターを返すためです。