- ベストアンサー
16進ダンプのプログラム
変数の中身を16進数で1バイトずつダンプするにはどんなプログラムを作ったらいいのでしょうか? ためしに、こんなプログラムを作ってみました。 #include <stdio.h> int main() { int intdata=10; char *intptr; intptr=&intdata; printf("%02x %02x %02x %02x\n", *intptr,*(iniptr+1),*(intptr+2),*(intptr+3)); return 0; } ところが、これでは実行結果が、 0a 00 00 00 となって、思い通りに出力されていないように思います。これは何かプログラムに問題があるのでしょうか?それともこの実行結果でよいのでしょうか? 僕は、 00 00 00 0aと表示されるかと思っていたのですが・・・。
- C・C++・C#
- 回答数5
- ありがとう数3
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
リトルエンディアン(Little Endian)とビッグエンディアン(Big Endian)という言葉をご存じでしょうか。 2バイト以上のデータ量の数値データの記録方式にはリトルエンディアン(最下位のバイトから記録します。Intel系のプロセッサがこの記録方式です。)とビッグエンディアン(リトルエンディアンと逆で、最上位のバイトから記録します。Motorola系のプロセッサがこの記録方式です。)があります。 0a 00 ?? ??となったのはIntel系のプロセッサだからです。??と書いたのは、ここには何が来るか不明だからです。00 00 00 0aを期待していますが、int intdate=10;としているので結果は2バイトですよね。 ビッグエンディアンを期待するのであれば、00 0a ?? ??です。
その他の回答 (4)
再び #1 です。 void dump(void* p, int cb); 16 進ダンプを表示する。 p : 変数(メモリ領域)の先頭へのポインタ cb : 変数(メモリ領域)のサイズ のような関数を作っておいて、 int intdata = 10; double doubledata = 10.0; dump(&intdata, sizeof(intdata)); dump(&doubledata, sizeof(doubledata)); という風に呼び出すことにすれば便利そうじゃないですか? # ちなみに、 # int 型のサイズは処理系依存です。 # (よほど古いものでない) VC++ や BCC なら 4 バイトです。
それで正しいです。 というのは、Intel系のCPUではメモリ上のデータ並びがひっくり返るからです。 4バイトの変数型では、0x12345678という値はメモリ上では0x78 0x56 0x34 0x12という並びになります。 2バイトの変数型では、0x1234という値はメモリ上では0x34 0x12という並びになります。
おっとすいません。#1 です。 > unsigned char **intptr; > にしておいたほうが無難です。 ↓訂正 unsigned char *intptr; にしておいたほうが無難です。
正しい実行結果です。 Intel 系の CPU では数値をメモリ上に格納する場合、 下位バイトから順に格納されます。 こういう格納の仕方を「リトルエンディアン」と言います > char *intptr; unsigned char **intptr; にしておいたほうが無難です。 理由は、 int intdata=0xff; などとしてみれば分かると思います。
関連するQ&A
- プログラムの動きがわからない
現在C言語の勉強をしているのですが、プログラムの動きが(流れ)よくわかりません。 #include <stdio.h> int is_digit(char x) { if(((x)>='0')&&((x)<='9')){ return 1; } else{ return 0; } } main() { char c; c='0'; if(is_digit(c)){ printf("cは数値文字です。\n"); } return 0; } 上記のプログラムなのですがどのように値渡しが行われているかがわかりません。 ちなみにこのプログラムを書き直すとこのように↓なるようです このプログラムだけエラーが出てしまいました。 #include <stdio.h> #define IS_DIGIT(X) (((X)>='0')&&((X)<='9'))?1:0) main() { char c; c='0'; if(IS_DIGIT(c)){ printf("cは文字列です。\n"); } return 0; } ちなみに教本はこれを使っています。http://7andy.yahoo.co.jp/books/detail?accd=31457604
- ベストアンサー
- C・C++・C#
- 配列について
初歩的な質問ですいませんが、質問よろしくお願いします。 ◎1----------------------------- #include<stdio.h> int main(void) { char ss[10]="AB"; printf("ss=%s\n",ss); return 0; } ------------------------------------ ◎2-------------------------------- #include<stdio.h> int main(void) { char ss[10]; ss[0]='A'; ss[1]='B'; ss[2]=0; printf("ss=%s\n",ss); return 0; } ----------------------------------- ◎3------------------------------- #include<stdio.h> #include<string.h> int main(void) { char ss[10]; strcpy(ss,"AB"); printf("ss=%s\n",ss); return 0; } ----------------------------------- ◎4------------------------------- #include<stdio.h> int main(void) { char ss[10]; ss="AB"; printf("ss=%s\n",ss); return 0; } ---------------------------------- 以上4つのプログラムで、◎2と◎3は正常に動くと理解できたのですが、何故、◎1は正常に動き、◎4は「'const char [3]' から 'char [10]' に変換できません。」といったようなエラーが出てしまうか分かりません。 教えていただければ嬉しいです。
- ベストアンサー
- C・C++・C#
- 再帰プログラム
strに格納されている文字数を数えるプログラムです。 #include<stdio.h> int rstrlen(char *); int main(void) { char str[] = {"abcdefghijk"}; printf("文字数:%d\n",rstrlen(str)); return 0; } int rstrlen(char *p) { if(*p) { p++; printf(p); return 1 + rstrlen (p); } else return 0; } return 1 + rstrlen (p);の部分で再帰をし1をプラスすることにより文字数をカウントしmainのprintfで文字数を表示しているのですがカウントしている値はどこに格納していてどのようにmainに返しているのかが分かりませんでした。教えてください。
- ベストアンサー
- C・C++・C#
- strstr()を使ったプログラムについて
上のプログラムでは正しい結果がでて、下のプログラムでは正しい結果がでない理由を教えてください。 <上のプログラム> #include<stdio.h> #include<string.h> main() { char *str = "Apple,Lemmon,Apple,Orange,Grape,Apple,Lemmon"; int i = 0; while((str = strstr(str,"Apple")) != NULL){ str++; i++; } printf("文字列の中にAppleは%d個含まれます。",i); return 0; } <下のプログラム> #include<stdio.h> #include<string.h> main() { char *str = "Apple,Lemmon,Apple,Orange,Grape,Apple,Lemmon"; int i = 0; while(strstr(str,"Apple") != NULL){ str++; i++; } printf("文字列の中にAppleは%d個含まれます。",i); return 0; } 実行環境はBorland C++、上のプログラムでは正しく3と表示されますが、 下のプログラムでは33と表示されてしまいます。
- ベストアンサー
- C・C++・C#
- 二次元配列の対各成分を書き出すプログラムについて
実行結果が3,5,7を書き出すプログラムを作成したいです。1,5,9を書き出す(以下のプログラム)を書き出すものは出来たのですが、3,5,7を書き出すプログラムが解りません。誰か解る方、教えて下さい。 #include<stdio.h> int main(void){ int i,mt[3][3]= {{1,2,3}, {4,5,6}, {7,8,9}}; for(i=0;i<3;i++){ printf("%d",mt[i][i]); } printf("\n"); return(0); }
- 締切済み
- C・C++・C#
- ポインタ配列のアドレスについて
#include <stdio.h> int main() { int i; char *ary[] = { "a" , "b" , "c" }; for(i=0; i<3; i++) printf("%u\n" , &ary[i]); return 0; } /*実行結果 6618616 6618620 6618624 */ 上記のプログラムを実行したときポインタ配列*aryがchar型だろうがdouble型だろうがアドレスが4つとびになるのですがなぜなんでしょう?アドレスを求めるプログラム自体が間違っているのでしょうか?
- ベストアンサー
- C・C++・C#
- ASCIIコード入力
プログラムを作っていてどうしてもわからなくなりまして… #include <stdio.h> int main(void) { char c; c=38; printf("%c\n",c); return 0; } この場合は&が出てくるからいいんですけど… #include <stdio.h> int main(void) { char c; scanf("%c",&c); printf("%c\n",c); return 0; } この場合は97をscanすると9が出てきます。ASCIIコード入力でaを表示させたいんですが、何が間違っているのでしょうか? 初心者なもので…お願いしますm(__)m
- ベストアンサー
- C・C++・C#
- ポインタの基礎的なこと
#include <stdio.h> int main() { char *a; *a='X'; printf("%c\n", *a); return 0; } 実行すると、"X"がきちんと出力されるんですが、 この場合"X"という文字が格納されている場所(ポインタが指し示している場所)は、メモリが確保されていないので、もっと長いプログラムになった場合に、この"X"が格納されている場所は、ほかの変数の領域に割り当てられたりして使われてしまう可能性があるということなんでしょうか?
- 締切済み
- C・C++・C#
- 再帰プログラム
#include<stdio.h> int rstrlen(char*); int main(void) { char str[100]; printf("文字列を入力してください\n"); gets(str); printf("文字数は %d です\n",rstrlen(str)); return 0; } int rstrlen(char *p) { if(*p){ p++; return 1+rstrlen(p); } else return 0; } 文字数を計算するプログラムです。 if(*p)の*pとはNULLを表しているのですか?
- ベストアンサー
- C・C++・C#
- プログラムがうまく動作しない
int型変数aとbにそれぞれ値を入力し、それらをかけた結果を出力するプログラムをつくりました。もし文字が入力されたら yarinaoshi と表示し再びaに値を入力するように指示します。しかしこのプログラムはデバグしても何のエラーもないのですが、実際に実行し文字を入力すると Microsoft C++ Debug Library というダイアログボックスが出てきて Abort, Retry, Ignore の三つのボタンがでてきます。どれを選んでも作業は止まってしまい、思ったような結果が得られません。一体どうすればいいのでしょうか? 以下がそのプログラムのソースコードです。 #include <stdio.h> #include <ctype.h> #include <stdlib.h> int kakezan(int a, int b); int main(void) { int dt= 1; int a, b; while(dt !=0){ printf("Int1:"); scanf("%d", &a); if(isalpha(a) != 0) { printf("yarinaoshi"); scanf("%d", &a); } printf("Int2:"); scanf("%d", &b); dt = kakezan(a, b); printf("Result:%d\n", dt); } return 0; } int kakezan(int a, int b) { int dt; return dt = a*b; }
- ベストアンサー
- C・C++・C#
お礼
皆さん回答ありがとうございます。 だけど、どうしてIntelはこんなことをしたのでしょうか? ビッグエンディアンとかリトルエンディアンとかをして、どのような得があるのでしょうか?教えてくださればうれしいです。