• ベストアンサー

char*型が0x0を含む場合

honiyonの回答

  • ベストアンサー
  • honiyon
  • ベストアンサー率37% (331/872)
回答No.1

こんにちは、honiyonです。  ハズレです。  最初に 4byte確保したなら、str[2] = NULL; としても 4byte確保されています。  char*型はあくまで「char型へのポインタ」であり、メモリの操作は行いません。  0x00 も立派な「データ」ですよ。  char* = 文字列データ という意味合いが強いですが、あくまで char型は「0~255の整数型」であり、それ以外の用途にも使用される事があります。 char* でメモリを確保し、バイナリデータを扱う事だって出来ます。  参考になれば幸いです(..

A__
質問者

お礼

ありがとうございます。 ハズレでしたか。 メモリの操作は行わないという意味が分かりませんでした。 char *str = "abcd"; で5バイト確保される。 そして str を使う。 必要なくなったら、確保した5バイトを解放したい。 解放したい場合はどうしたらいいんですか? char *str = "abcd"; printf("%x,%x,%x,%x,%x\n", str[0], str[1], str[2], str[3], str[4], str[5]); str = "de"; printf("%x,%x,%x,%x,%x\n", str[0], str[1], str[2], str[3], str[4], str[5]); 結果は 61, 62, 63, 64, 0 64, 65, 0, 25, 23 この時、str が確保しているのはまだ5バイトですか? char *str = "abcd"; の後に str = "de"; としました。 どこかのサイトで、ポインタの値を書き替えてはいけない と書いてあったのを見たような記憶があります。 この結果は企画にない結果だったんですか? char *str; で宣言したポインタに大きなサイズのデータを格納した場合、 プログラムが終了するまで、その大きなサイズを確保しているのは よくないことだから解放したいと思って質問しました。

関連するQ&A

  • charポインタへの文字列による動的確保

    char *c=new char("abcd"); のようにして、cに"abcd"のポインタを代入しようとしたのですが、 error C2440: '初期化中' : 'const char [5]' から 'char' に変換できません。 と出てきてうまくいきません。 どの様にすれば、メモリ確保と同字に文字列で初期化できるのでしょうか?

  • C言語の型と配列

    char* str[10]={"a","b"}; char* str2="c"; としたときにstr=str2とすると 型が合わないといったエラーが出ます。 でもstrって結局はポインタの配列の先頭要素のアドレスですよね。 ポインタにポインタを入れているので通るのかなと思ったんですけど、 配列で宣言するとポインタにも型がつくのでしょうか? この例だと strは char * を10個持つ配列をさすポインタ  で、 str2はchar *をさすポインタ みたいなかんじです。 質問の意味がわかりにくいですが、ご指摘をいただければ補足しますので よろしくお願いします。

  • char型での演算子

    畏れ入ります。 X番目の文字を調べたいとき strにStringbufferで文字列が入っていた場合 if(str.charAt != "") とすることができません。 互換性のない型、と出てしまいます。 また、""を’’ とすると、「空の文字リテラルです」 と出てしまいます。 charが空であることを調べるのにはどうすればいいですか?

    • ベストアンサー
    • Java
  • C言語:小文字を大文字に変換する関数を作成

    C言語超初心者です。学校の課題で次のような問題が出されました。 ・問題・ 次に挙げる縛りに沿い、以下の関数とメイン関数を作り、処理結果を画面に作成しなさい。 char *tst(char *str) ・strの中の文字列も小文字を大文字に変換し、変換した文字列が格納されているchar *に返す。 ・引数strの中の文字列は受け取った状態で手を加えない。 ・関数内でmalloc関数を使用し、領域を確保して大文字に変換した文字列を格納しreturnでポインタを返す。 ・malloc関数を使用する。 ---------------------------------------------------------------------------------- 大文字に変換するには while(*str != '\0') { if(*str >= 'a' && *str <= 'z') { *str -= 'a'- 'A'; } ++str; } というのは分かったのですがここから何をすするか全く分かりません。初心者なのでなるべく分かりやすく教えてもらえると有難いです。 お願いします。

  • メモリの解放について

    文字列の左右のスペースを削除する関数を作っています。 そこで引数の文字列と同じ領域のメモリを確保し、そこで一時的にスペースを削除する作業をしています。 作業が終わったら、引数のポインタに文字列をコピーし、作業領域を解放したいと思っています。 しかし、確保した領域を解放しようとすると、「セグメンテーション違反」なるエラーが出て、解放できません。どなたか分かる方ご教授お願いします。 void trim(char *str) { int i; int len; char *tmp_p, *save_p; tmp_p = (char *)malloc(strlen(str) + 1); strcpy(tmp_p, str); save_p = tmp_p; len = strlen(tmp_p); // 後方スペース削除 // ポインタを最後まで進める for(i = 0; i < len - 1; i++) { tmp_p++; } // 文字だった場合'\0'でターミネート while(tmp_p != save_p) { if(!isspace(*tmp_p)) { tmp_p++; *tmp_p = '\0'; break; } tmp_p--; } // 前方スペース削除 // ポインタを最初に戻す tmp_p = save_p; // 文字が出てくるまでポインタを進める while(isspace(*tmp_p)) tmp_p++; strcpy(str, tmp_p); // free(tmp_p); // <- セグメンテーション違反 }

  • char型ポインタ

    よくプログラムで charポインタだけ指定して、 #include<stdio.h> int main(){ char* p; p = "abcdef"; printf("%s",p); return 0; } のようにしているのをみかけますが、 メモリーを確保していなくても問題ないのでしょうか? char* p; p = (char*)malloc(7); strcpy(p,"abcdef"); としたのと同じでしょうか?

  • CHAR型ポインタについて。

    CHAR型ポインタについて。 当方C言語初心者です。 ポインタと文字列の関係分からないことが出てきました。 参考にしている本があり、そのページに下記のソースで「const char *pc1」のポインタ変数を用意して、そこに直接文字列を代入しています。 本来、「char *pc1」はchar型のアドレスを格納するための変数のはずなのに、その変数に文字列を代入してることに疑問を感じました。 この記述の仕方は間違っていないのでしょうか?また、アドレスを格納するための変数「*pc1」に「abcdefg」の文字列はどのようにメモリ上で格納されているのでしょうか? 知ってどうなるの?みたいな質問かもしれませんが、ご教授いただけると幸いです。 #include <stdlib.h> #include <string.h> void func(void) { const char *pc1 = "abcdefg"; //←ココ char *pc2 = (char *)malloc( strlen(pc1) +1); if ( pc2 ) { strcpy( pc2, pc1 ); free( pc2 ); } }

  • char *name1[4] とchar name2[][4] の違いについて

    C言語のことで質問があります。 char *name1[4]は char *name1[4] = {"abcdefghi","jkl","l","mn"}; と宣言でき,ポインタを4つ確保した形となりました。 char name2[][4]は char name2[][4] = {"abc","def","ghi","jkl","mno","pqr","stu","vwx"}; と4文字以内の文字列を初期化した数だけ確保した形となりました。 この結果からchar *name1[4]の意味は,char name2[][4]ではなくchar name2[4][]に近いと思いました。 しかし,char name2[4][]ではポインタを4つ確保した事にはならないみたいでコンパイルが通りません。 *name1[4]では4つのポインタを確保できるのに~と思ってしまいます。 ポインタと配列は別物と考えるべきなのでしょうか? 訳の分からない質問かもしれませんが, 何卒ご指導いただくようよろしくお願いします。

  • (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*)が ついていますが、これはどういった意味があるのでしょうか?

  • c言語 型変換について

    c言語 型変換について 下記のように文字コードは、unsigned int型('B')をunsigned char 型(str[1] ) 格下げする型変換する規則を教えてください。 *質問ソースプログラム: int main(void) { char str[4]; /* 文字列を格納する配列 */ str[0] = 'A'; /* 代入 */ str[1] = 'B'; /* 代入 */ ・・・・・・ printf("size B %u\n",(unsigned)sizeof('B')); printf("size str[1] %u\n",(unsigned)sizeof(str[1])); * 実行結果 size B 4 size str[1] 1