char str[100];
char *ptr;
wsprintf(str, "%d", "1234567");
と
wsprintf(ptr, "%d", "1234567");
について、
TextOut(hDC,0,10,str,lstrlen(str));
TextOut(hDC,0,30,ptr,lstrlen(ptr));
で出力したいんだけど、str ならできたけど、
ptr の方が文字化けしていました。
lstrlen(ptr); がいけないのかと思って、
その値を調べたら 0 でした。
strlen( ) はポインタに対応していると思いました。
#include <iostream.h>
main(){
char *p = "あいう";
cout << strlen(p);
}
で 6 だったから。
Win32 の lstrlen( ) はポインタに対応していないんですか?
No.3ベストアンサー
- 回答日時:
> new char[100];
この場合、char 型で、100個分確保して、そのポインタが返ります
new int[50] だったら int 型50個分
もちろん、型だけでなく、クラスも指定出来ます。
new string[50]
> 0065FE08, 0065FE0C, 0065FE10
> で、&ptr が 0065FE00 だったとすると、
> (ptr+2) = "aaa";
*(ptr+2) = "aaa"; の間違いですよね^^;
> としたら、sonota[] の値が変更されてしまうしいうことですね?
変更されますが、変更される値は"aaa"のポインタが、sonata[0]以降に格納されます。
書き換える先が、システムの領域だったら、「不正なアクセス」が起きて、プログラムが落ちます。Linuxだと「Segmentation fault」です。
後、配列とポインタは同じものと思っておいても通常差しつかえありません。array[a] は *(array + a) の様に解釈されます。そのため
int array[3] = { 1,2,3 };
printf("%d, %8x\n", array[0], &array[0]);
printf("%d, %8x\n", 0[array], &0[array]);
printf("%d, %8x\n", array[1], &array[1]);
printf("%d, %8x\n", 1[array], &1[array]);
printf("%d, %8x\n", array[2], &array[2]);
printf("%d, %8x\n", 2[array], &2[array]);
を実行してみてください。ただし、わかりにくくなるトリッキーな書き方なので、使わないのが普通です。
ありがとうございます。
分かりました。
(ptr+2) = "aaa";
は
*(ptr+2) = "aaa";
の間違いでした。
No.4
- 回答日時:
まず、"1234567" が間違っています。
wsprintf(str, "%d", "1234567");
は、3つ目の引数はint型の変数だから、それを文字列に変換してstrの指す先にコピーしてくれ、という文です。
だから、
wsprintf(str, "%d", 1234567);
が正しくなります。
char str[100];
char *ptr = str;
とすると簡単に動作させられます。
char *ptr = "\0";
とするのは、ほかの方もおっしゃいますが、ほかの方とはまた違う理由で、この使用を勧めません。
配列初期化文以外の場所で "ほげほげ" と記述したとき、たとえばポインタ初期化で
char *y = "ほげほげ";
などと記述した場合、この値はどこかで
static char x[] = "ほげほげ";
と宣言されているものとして、そこにxを記述するのと同じこととなります。
つまり、"" で囲むと、プログラム起動時に自動的に静的変数が確保されるのです。
また、次のようなことが起こる場合もあります。
strcpy("abcd", "efgh");
printf("abcd");
出力: efgh
"abcd" という領域に "efgh" をコピーしろという変な文です。
そして "abcd" をプリントしているにも関わらず、"efgh" が出力されてしまうのです。
コンパイラの最適化機能によっては、""で囲んだ同じ文字列は、同じメモリ領域を指していることがあります。
よって、すべての "abcd" が "efgh" に書き換えられしまったのです。
よって言えることは、
○ ""で囲んだリテラル文字列を、文字列へのポインタ変数に代入してはいけない。
ということです。
ポインタマニアの、はぽるんでした。
No.2
- 回答日時:
かなり危険ですね。
char *ptr;
として宣言しただけでは、ある、メモリ領域を指示するための、言ってみれば
目印みたいなものが用意されるだけに過ぎません。
ポインタのみを宣言した場合は、1番の方が書いているように、newなりmalloc
なりで、必要なメモリ領域を確保する必要があります。
目印が用意されただけだと、実際にどこにアクセスしいいのかは不明なため、
(下手をすればシステム領域をさしている)怪しい挙動を示します。
>char *ptr = "\0";
>としたら、できたみたいでした。
とかいてありますが、これだと、ptrの先には1バイト分の領域しか用意されません。
それを超えた分は、他のメモリ領域を食い荒らします。ということは、最悪クラッシュ
するということですね。
ポインタは、なんでも出来てしまうが故に、一番危険な存在です。
メモリの割付は忘れずにしましょう。
char *ptr = "\0";
でだいじょうぶかと思っていたらだめでしたか。
他のメモリ領域を食い荒らすというのは、
char sonota[] = "xxx";
があったして、そのアドレスが
0065FE08, 0065FE0C, 0065FE10
で、&ptr が 0065FE00 だったとすると、
(ptr+2) = "aaa";
としたら、sonota[] の値が変更されてしまうしいうことですね?
この解釈が間違っていたら教えてください。
No.1
- 回答日時:
char *ptr;
このあと、どこかで、メモリを確保していますか?>new などして
そうでなければ、
ptr = new char[100];
みたいなコードを入れてみてください。
ありがとうございます。
char *ptr; だけではだめだったんですね。
メモリの確保が必要ということで、
char *ptr = "\0";
としたら、できたみたいでした。
1バイトでも確保されたらいいみたいに思ったけど、
これで問題があるなら教えてください。
new char[100]; というのを知らないから、今はとりあえず
char *ptr = "\0"; としてみることにしました。
質問文を書き間違えてました。
正しくは
wsprintf(str, "%d", 1234567);
と
wsprintf(ptr, "%d", 1234567);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
歩いた自慢大会
「めちゃくちゃ歩いたエピソード」を教えてください。 長時間でも長距離でも結構です。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
wsprintf関数の使い方について
C言語・C++・C#
-
wsprintfで浮動小数を扱うには?
C言語・C++・C#
-
charからLPTSTRへの変換方法
C言語・C++・C#
-
-
4
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
5
CString から LPCTSTRの型に変換
C言語・C++・C#
-
6
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
7
ORA-01013のエラーについて経験のある方お願いします。
Oracle
-
8
wsprintfの書式制御文字列について教えてください
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語の文字リテラル中の16進文...
-
C言語にて構造体のメンバがNULL...
-
C言語で文字列をかえす正しい書...
-
小数点入りの文字列をfloat型に...
-
char 文字列型 の表現範囲が-12...
-
const char* s1とただのchar s1...
-
文字型配列に格納した空白の切捨て
-
36進数
-
#include <stdio.h> #include <...
-
ポインタを使って回文かどうか...
-
#include <stdio.h> int main(v...
-
C言語入門者です。今ポインタの...
-
[C] 構造体メンバーのカンマ区...
-
C++17で、unsigned char * 配列...
-
c言語の構造体について質問します
-
文字列の比較
-
動的メモリの初期化方法について。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
fstream型オブジェクトを関数の...
-
小数点入りの文字列をfloat型に...
-
char型にint型の数値を代入する。
-
const char* s1とただのchar s1...
-
new charとnew char[N]の違いは?
-
動的メモリの初期化方法について。
-
エクセルのMID関数は、C言語では?
-
C言語 strstrの実装
-
SetWindowTextについて。
-
char 文字列型 の表現範囲が-12...
-
文字列の途中から途中までを抽出
-
2次元配列の文字"列"の初期化方法
-
DWORDとcharの変換
-
C++17で、unsigned char * 配列...
-
C言語の文字リテラル中の16進文...
-
strcat関数を自作したいです
おすすめ情報