• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:配列)

配列に関する疑問

このQ&Aのポイント
  • C言語で配列についての疑問があります。
  • 関数に文字列データを渡す際に、関数側でメモリの確保が可能かどうか知りたいです。
  • 具体的には、引数として受け取った文字列データを利用してメモリの確保ができるのかを知りたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • don_cha
  • ベストアンサー率34% (139/407)
回答No.1

以下のような形になりますね。 #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); }

happy21
質問者

お礼

回答下さりありがとうございました。 細かなとこまで教えていただき、とても勉強になりました。 ありがとうございました。

その他の回答 (1)

  • Fooky
  • ベストアンサー率71% (59/82)
回答No.2

補足です。 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をつけてくれます。

関連するQ&A