• ベストアンサー

(char *)についての質問

以下のコードの意味が理解できなかったので質問させていただきます。 str=(char *) malloc (sizeof(char) * (num+1)); ここで理解できなかった部分はstr=(char *)の部分(ここでさしているchar *とは何なのか?)とmalloc()関数内の「*」です。 ご回答よろしくお願いいたします。

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

  • ベストアンサー
  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.2

現在のCではmallocに(char*)などキャストをつける必要はないです. まず先頭のchar*ですが,これは括弧の中に入っていて意味が生じます.それは型変換(キャスト)です.mallocはvoidへのポインタ(void*)なので,キャラクタへのポインタ(char*)へ変換しようという意図なのでしょう.ただ,void*はどんなポインタ型にも適合する特殊なポインタ型なので,キャストは不要です.というか,型不適合があってもキャストが入っているとエラーにならないので,やめた方がよいとされています. 後ろの方は,char*ではなくて, ( sizeof(char) ) * (num + 1) という意味で,掛け算です.

0slowlykick0
質問者

お礼

貴重なお時間を頂いて本当に感謝しています。 mallocにキャストをつける必要がないという大変ためになるご回答ありがとうございました。 とても勉強になりました。

0slowlykick0
質問者

補足

非常に分かり易いご説明ありがとうございます。 ご回答頂いた内容と、参考書を見て理解が深まりました。 差し支えなければもうひとつお聞きしたいのですが参考書にはキャスト演算子の使い方が inum=(int)dnum; と記載されており「*」が付いていないのですがキャスト演算子内での「*」の意味は何なのでしょうか?

その他の回答 (2)

回答No.3

通りすがりに答えてみる。 inum=(int)dnum;  INT型へのキャスト inum=(char)dnum;  CHAR型へのキャスト inum=(char *)dnum; CHARポインタ型へのキャスト という訳でキャスト演算子内での「*」の意味は ポインタを表しています。

0slowlykick0
質問者

お礼

ご回答いただき本当にありがとうございました。 「*」はポインタ型を指していたのですね!! これで理解が深まり先に進めそうです!! ありがとうございました。

  • tv_junky
  • ベストアンサー率8% (1/12)
回答No.1

>>str=(char *)の部分(ここでさしているchar *とは? キャストというもので、strに値を代入するときの型を表します。 mallocの戻り値は "void *"ですのでそれを "char *"にしています。 >>tr=(char *)の部分(ここでさしているchar *とは? こちらは単純に掛け算の演算を表しています。

0slowlykick0
質問者

お礼

ご回答ありがとうございます。 sizeof()で確保したメモリを(num+1)の分掛けるという意味だったのですね。もう一方はキャスト演算子ということが分かってとても勉強になりました。 キャスト演算子内の「*」について理解ができていないのでもし差し支えなければご教授いただきたいです。

関連するQ&A

  • qsortの引数について

    以下のプログラムがあります。 int compare( const char **name1, const char **name2 ) { return strcmp( *name1, *name2 ); } int main( void ) { char *names[] = { "rand", "calloc", "malloc" }; int num = sizeof names / sizeof names[0]; qsort( names, num, sizeof( names[0] ), (int (*)(const void *, const void * ))compare ); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~この部分 return 0; } 上の「~~~」の上の部分のqsort関数の第4引数のキャストの意味が 分かりません。なぜ関数の前に引数が書かれるのでしょうか? またintの後にある(*)は「int型のポインタ」と言う意味なのか、 compare関数のポインタなのかも分かりません。 ご回答よろしくおねがいします。

  • (char*)について

    ソースを見ている際に、 以下のようなソースがありました。 構造体Aのメンバ char x char y[5+1] の2つがあり、 ある関数のなかで構造体Aのポインタを引数で渡しており、 それをマクロに対して、 (1)マクロB("あいうえお",(char*)A->x, sizeof(A->x,) ) (2)マクロB("かきくけこ",A->y sizeof(A->y) ) という風にわたしていました。 そこで質問なのですが、(1)に対してだけ第2引数に、(char*)が ついていますが、これはどういった意味があるのでしょうか?

  • char *str; と char* str;

    char *str; と char* str; どっちも同じことを意味しているんですか?

  • char型+char型ってint型? if(char型==int型)?

    C言語の「汎整数拡張(インテグラルプロモーション)」というものに関するものだと思います。 char型とchar型を加えた結果は、char型でしょうか。それともint型でしょうか。 (下のプログラムの printf("sizeof(a[0]+a[1])は%d\n", sizeof(a[0]+a[1])); /* char型+char型 */ という部分の結果は4なので、int型と考えるべきなのかな。) 私は、char型とint型の加算の結果はint型だと思っていましたが、 char型とchar型の加算の結果はやはりchar型だと思っていました。 (それが間違えているのでしょうか。) if(a[0]==i) /* char型とint型の比較(?) */ の部分では、左辺はchar型、右辺はint型ですが、このように型の違う変数を比較しても文法上構わないのでしょうか。 (私は、「比較は必ず型の同じもの同士でしかできない」と思っていました。) 左辺はchar型のように見えて、じつはint型ですか。 #include <stdio.h> int main(void) { char a[4]; int i=77; printf("sizeof(int)は%d\n", sizeof(int)); printf("sizeof(char)は%d\n", sizeof(char)); printf("sizeof('M')は%d\n", sizeof('M')); printf("sizeof(a[0])は%d\n", sizeof(a[0])); a[0]='M'; a[1]=7+6; a[2]=a[0]+a[1]; printf("sizeof(a[0]+a[1])は%d\n", sizeof(a[0]+a[1])); /* char型+char型 */ printf("sizeof(+a[0])=%d\n", sizeof(+a[0])); if(a[0]==i) /* char型とint型の比較(?) */ puts("a[0]==i"); else puts("a[0]!=i"); return(0); } ちなみにワーニングもエラーもなんにもでません。

  • 多分ボケてます・・

    int main(){ char *str; str = (char *)malloc(110); printf("%d", sizeof(str)); free(str); return 0; } なぜか表示が4です。 今まで普通にmalloc使ってたのに・・・1週間くらい間空けたら、使えなくなりました。 自分では文法的になんの間違いもないと思っていても、きっとどこかに間違いがあるはず。ということで人頼みです。。 どこが違いますか・・?

  • char*型が0x0を含む場合

    char *str = {0x61, 0x62, 0x0, 0x64}; ができないから、 char *str = "abcd"; str[2] = 0; として、{0x61, 0x62, 0x0, 0x64} という文字列を作ってみた。 このポインタ str は解放する必要がない。 malloc( ) で確保したなら free( ) する必用がある。 普通のポインタは、もしかしたら 0x0 までしか 確保されていないのかなと思いました。 この場合では、str[3] == 0x64 だという結果になったけど、 それは str[2] の次のデータが 0x64 だったわけで、 str[2] に 0x0 が入った時点で、str[3] 以降の領域は str とは無関係かもしれないと思いました。 つまり、char*型は、0x0 までの部分だけを確保し、 この例のソースでは、str[3] 以降の領域は確保されていないから 後で、知らないうちに値が変わっている可能性がある。 という想像をしてみたけど、あってますか?

  • char形配列の整数を抜き出したい

    char str="今週,23位"; int a; という配列の数字の部分(23)を抜き出してaに放り込みたいのですが、便利な関数とかあれば教えて頂けないでしょうか。お願いします。 

  • char* を渡したとき、不適切なPtrが出る問題

    こんばんは。プログラムを勉強中の学生です。 詰まった部分があり、関連しそうな部分を勉強しましたが、問題が解決しなかったので、 こちらで質問させて頂きます。 今、とあるクラスで、 class Test{ ........................................ public: int Func1(char* str,){ unsigned int n = 0; while(str != "\0"){ n += *str; str++;}          ←ここに<不適切なPtr> return n % 3; } void Func2(char* str){ int i; i = Calc(str); ..................................... ............................ } }; のように宣言し、main()関数で、 int main(){ Test test; test.Func2("ABC"); // Case1: エラーは起こらない char s[]={"ABC"}; //Case2:不適切なPtrとなる。 test.Func2( s ); } としていますが、上記のように、"ABC"を直接入れたときのみ、うまくいき、 他の方法で、char型のポインタを代入した際には、不適切なPtrと出てしまいます。 この原因を教えていただけないでしょうか? 最終的には、 cin >> s ; などのように、キーボードから入力した値(文字列)を使いたいのですが、 現段階ではmain関数で "ABC"のように書かなければならず困っています。

  • mallocでメモリーを確保しようとすると暴走します

     組み込み系のプログラミングをやっているもので、malloc、freeを使って動的にメモリーの確保、開放を行っているのですが、途中で暴走してしまいます。 (mallocを呼び出すと、返ってこなくなります。)    そこでmallocの動作を見ようと、以下のプログラムを作って動作させると、while文の中を一周はするのですが、2週目のp2のポインターの値が返ってきません。(malloc関数の中でloopしています。)     /* 以下ソースコード */  char *p1;  char *p2;  char *p3;  char *p4;  while(1){    p1 = (char*)malloc(100);    p2 = (char*)malloc(100);    p3 = (char*)malloc(100);    free(p3);    p4 = (char*)malloc(100);    free(p4);    free(p2);    free(p1);  }  ※メモリーは、2k確保していあるので、サイズがオーバーしているということはないと思います。  ご質問ですが、  ・上記ソースコードで暴走するような要因がありますでしょうか?  ・malloc、free関数でメモリーの取得、開放の順番など注意しないといけないことがあるのでしょうか?  ・malloc、free関数等を自作とかされていますでしょうか?  どうぞよろしくお願い致します。

  • malloc関数(strtok関数の自作版)につきまして分からないこと

    malloc関数(strtok関数の自作版)につきまして分からないことがあります。 以下のプログラムにmallo関数がフリーする最適な位置を明示しなさいといわれました。 文字が分離した時にfreeすると助言されたのですが いまいち理解できません・・・。 条件式の中で使用するともいわれていました。(おそらくif文・・・。) 色んな意見を参考にしたいので詳しい方助言のほうよろしくおねがいします。 なおプログラムはほかの箇所を変更したり、他の場所でもmalloc関数を使用することが認められています。 またfreeする場所はメイン関数ではなくあくまでもstrtok関数の中で宣言するようです。 よろしくお願いします。 #include <string.h> #include <stdio.h> #include <stdlib.h> main(){ char* s2 = ",/"; char* result; char* r1; char* r2; char* r3; char* r4; result = strtok("//123//,45/,678,9/","/,"); r1 = strtok(NULL, s2); r2 = strtok(NULL, s2); r3 = strtok(NULL, s2); r4 = strtok(NULL, s2); printf("%s\n",result); printf("%s\n",r1); printf("%s\n",r2); printf("%s\n",r3); printf("%s\n",r4); return; } char *strtok(char *s1, const char *s2) { int i,len; char *str1, *str2 , *str3; static char *tok ; static char* mstr; if(s1 != NULL) { str1 = s1; } else { str1 = tok; } str2 = str1 + strspn(str1, s2); /* strspnを利用 */ if (*str2 == '\0') { return (NULL); } len = 1; i = 0; while(*(str2 + i) != '\0'){ len++; i++; } mstr = (char*)malloc(sizeof(char)*len); if(mstr == (NULL)) { return 0; } i = 0; while(*(str2 + i) != '\0'){ *(mstr + i) = *(str2 + i ); i++; } *(mstr + i ) = '\0'; str3 = mstr + strcspn(mstr, s2); /* strcspnを利用 */ if (*str3 != '\0'){ *str3 = '\0'; str3 = str3 + 1; } tok = str3; return (mstr); }