これは私がこれまでに持っているものですが、何が問題なのかわかりません
void newCopy(char *s)
{
char newString = malloc(sizeof(int * strlen(s)));
newString = s;
return &newString;
}
void newCopy(char *s)
{
char newString = malloc(sizeof(int * strlen(s)));
1 番目と 2 番目の問題はここにあります。
まず、ポインタである malloc の戻り値を、 として宣言された変数に代入していchar
ます。変数は として宣言する必要がありますchar*
。
2 つ目は、への入力sizeof
が間違っていることです。
int * strlen(s)
型と整数を乗算しようとしているため、ナンセンスであり、コンパイルされません。あなたはsizeof(int)
(これは整数です)* strlen(s)
(これも整数です)コンパイルすることを意味しました。\0
C の文字列は、strlen が文字列の長さの一部であると報告しないエクストラによって null で終了する必要があるため、サイズに 1 を追加する必要があります。すべてを一緒に入れて、sizeof(char)*(strlen(s)+1)
newString = s;
3番目の問題はここにあります。=
は魔法の演算子ではありません - 変数の値s
(ポインター) を変数の値newString
(上記の間違いを修正した後、ポインターにもなります) に代入します。それ以外には何もしません。
代わりに、strcpy を使用します。これは、1 つの文字列の内容を (ポインタをたどって) 別の文字列の内容に (ポインタをたどって) コピーする関数です。http://www.cplusplus.com/reference/cstring/strcpy/
return &newString;
4番目と5番目の問題はここにあります。
4 つ目は、関数を as として宣言し、void
ここで char* を返そうとしていることです。
5 つ目は、スタック上で宣言されたもの (ローカル変数) へのポインターを返そうとしていることです。関数が戻るとすぐに、その関数のスタックにあるものはゴミになり、参照できなくなります。
newString
ただし、 typeを正しく作成した場合char*
はreturn newString;
、ヒープを指す値によってポインターを正しく返すだけです (以前の malloc のおかげです)。
}
最後に、このコードから判断すると、C は初心者に優しい言語ではないことをお知らせしておきます。C では、発生させたいことの「ように見える」ものを入力して、それが機能することを祈るだけです。少しでも間違っていると、コードがクラッシュし、正しい方法がわからないため、その理由がまったくわかりません。C に関する非常に優れた本を読んで、基礎から上級まですべてを段階的に学習して、すべてがどのように機能するかを理解するか、よりユーザーフレンドリーな言語を選択してください。
私の意見では、このコードの間違いの数と (特に) 性質を考えると、おそらくC に関する優れた本を入手する必要があることを指摘することから始めなければなりません。
newString = s;
割り当てたばかりのスペースに文字列をコピーする代わりに、ポインターを上書きします。したがって、コピーを作成せずに、割り当てたばかりのものへのポインターを失います (メモリをリークします)。strcpy
おそらく、直接代入の代わりに使用したいと思うでしょう。
割り当てるサイズの計算も、本当に必要なものではありません。通常、長さ N の文字列の場合、N+1 バイトを割り当てます。現在、バイトを割り当てようとしていsizeof(int * strlen(s))
ますが、コンパイルすることさえできません。
修正版は次のようになります。
char *newCopy(char *s)
{
if (s == NULL)
return NULL;
char *newString = malloc(strlen(s) + 1);
if (newString == NULL)
return NULL;
strcpy(newString, s);
return newString;
}