• ベストアンサー

文字列変換プログラムのポインタについて

いかの関数は、文字列を16進文字列に変換する関数です。過去の質問を参考に自分で作りました。 動作することはするんですが、よく見るとpoとpiは領域確保していません。これってプログラム上まずいでしょうか。 char *conv( char *buff, char *str ) {   char *po;   char *pi;   for(po=buff, pi=str; *pi; pi++)   {     if(0 <= *pi && *pi <= 15)     {       sprintf(po, "%x", 0);       po++;       sprintf(po, "%x", *pi);       po++;     }else {       sprintf(po, "%x", (0x0f & (*pi >> 4)));       po++;       sprintf(po, "%x", (0x0f & (*pi % 16)));       po++;     }   }   *po='\0';   return(buff); }

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

  • ベストアンサー
  • f_attck
  • ベストアンサー率33% (40/118)
回答No.3

#1の方が言われているように問題無いと思います。 (この関数内では) つまり、引数で受け取ったbufとstrの領域がcall側で確保 されていれば問題ありません EX) buf[10]; str[10]; という宣言の変数をcall側でしておき conv(buf, str); もしくは char *buf; char *str; buf = (char*)malloc(10); str = (char*)malloc(10); と領域を確保したうえで conf(buf, str) 上記のいずれかなら問題ありません。 呼び出し側でも領域確保していない char *buf; char *str; conf(buf, str); ならNGです。 (これで動いているとすれば、運が良い=たまたまということでしょう)

hibachi
質問者

補足

回答ありがとうございます。 call側では領域を確保していますので、これでOKということですね。mallocの使い方など参考になりました。いずれにせよ、ポインタの勉強が必要だと思いますので書籍など探してみたいと思います。

その他の回答 (2)

回答No.2

領域を確保した直後に   for(po=buff, pi=str; *pi; pi++) によって書き潰してしまうから意味がない(やってはいけない)

hibachi
質問者

補足

回答ありがとうございます。よく考えてみたんですが、poとpiはアドレスを操作するのに使っているみたいですね。あ、po はscanfで値をいじくっていますが。自分で作ってなんですが、ちょこっと修正しただけなものですから。

回答No.1

問題ありませんよ。 ポインタというのは、 確保した領域の場所を覚えておくためのもので、 ポインタ自身の領域は変数の宣言時に確保されます。 よって、ここでは問題にはなりません。 ポインタに関しては理解に苦しむかもしれませんが、 いろいろと便利なのでちゃんと勉強してみるといいですよ(^_^)

hibachi
質問者

補足

回答ありがとうございます。

関連するQ&A