- ベストアンサー
配列に関する疑問
- C言語で配列についての疑問があります。
- 関数に文字列データを渡す際に、関数側でメモリの確保が可能かどうか知りたいです。
- 具体的には、引数として受け取った文字列データを利用してメモリの確保ができるのかを知りたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
以下のような形になりますね。 #include <stdio.h> #include <stdlib.h> #include <string.h> void test(char* hiki); void main(void) { char inp[256]; scanf("%s", inp); /* ←&は要らない */ printf("%s\n", inp); test(inp); /* 適当な処理 */ /* return; ←省略可(関数の型はvoidなので、戻り値も要らない return 0ではコンパイルが通らない) */ } void test(char* hiki) { char* i; i = (char*)malloc(sizeof(char) * strlen(hiki)); /* i = (char*)malloc(strlen(hiki)); でも動きますが、 */ /* sizeof(char)を入れておいたほうが個人的には良いと思います */ /* 適当な処理 */ free(i); }
その他の回答 (1)
- Fooky
- ベストアンサー率71% (59/82)
補足です。 void test(char* hiki) { char* i; i = (char*)malloc(sizeof(char) * (strlen(hiki)+1)); strcpy(i, hiki); free(i); } のように、iに割り当てる配列の大きさは、strlen(hiki)よりも 最低でも1だけ大きくないといけません。お持ちのCのテキストの どこかに書いてあると思いますが、文字列には終端記号が最後につきます。 例えば、"ABC"という文字列は、配列内では 65 66 67 0 という形で4バイトの領域を使って保存されています。 また、strlen("ABC")は、4ではなく3を返す(終端文字は考慮しない) ので、strlen()を使ってmalloc()する時には注意が必要です。 あと、細かいことですが、文字列を読み込むだけなら、 scanf()よりもfgets()がお勧めです。scanf("%s", inp)は、 inpが何バイトの領域を持った配列かを考慮しないので、 256バイト以上読み込んでしまって、セグメントエラーに なる可能性があります。 fgets(inp, 256, stdin); とやることで、fgets()は256バイトよりも1バイトだけ 少ない(終端文字の分)文字をstdin(標準入力)から受け取って、 inpに格納し、最後に終端文字0をつけてくれます。
お礼
回答下さりありがとうございました。 細かなとこまで教えていただき、とても勉強になりました。 ありがとうございました。