- PR -

C言語で初心者本を読んだ次の一手は?

投票結果総投票数:55
ポインタを徹底的に 47 85.45%
コンパイル周辺を理解しろ 3 5.45%
関数群を叩き込め 2 3.64%
初心者本もう一冊? 3 5.45%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-08-12 17:47
おお、凄い情報量になっている。皆様ありがとうございます。

業務で利用している OS は Solarisです。
IDEは家でダウンロードして遊んでみます。

引用:

ゆうじゅんさんの書き込み (2004-08-12 10:09) より:
どこが間違っていますでしょうか?
コード:
// 領域の確保
void AllocBuffer( char* pBuffer, int size )
{
	pBuffer = malloc( size );
}

// 領域の開放
void FreeBuffer( char* pBuffer )
{
	free( pBuffer );
}

// メイン
main()
{
	char* pBuffer;

	// 領域の確保
	AllocBuffuer( pBuffer, 20 );

	// 確保した領域に文字列をコピー
	strcpy( pBuffer, "TEST" );

	// コピーした文字列を表示
	printf( "[%s]n", pBuffer );
	
	// 領域の開放
	FreeBuffer( pBuffer );
	
}




正直な話、「間違いがある」と言われなかったら普通に動くと思ってしまう...
ソースを動かさずに脳内チェックだけで返答してみます。

回答:
  AllocBuffer関数で確保したメモリ空間を初期化していない事。

理由:
  (1)VBと異なりCでは確保したメモリが自動で初期化されない。
  (2)strcpy関数の操作では複写値にNullポインタが自動付与されない。(多分...)
  (3)長さ指定をしない文字列操作ではNullポインタ(0x00)で文字列の終わりを示す。
  (4)よってprintf関数の%s処理にて"TEXT"の後続に変な文字が表示される。
   または、コアダンプで異常終了する?運がよければセーフ?

如何でしょう?
NeXT
大ベテラン
会議室デビュー日: 2004/04/06
投稿数: 215
お住まい・勤務地: 江戸
投稿日時: 2004-08-12 17:49
LC で Think C を動かしていたのは今は昔...

引用:

おばけさんの書き込み (2004-08-12 11:50) より:
あと、今はもう売って無いかもしれませんが、昔C/C++用ではなくC用のIDEとして
Symantec Think Cという環境がありました。私はこれをMacintosh PowerBook 100
という白黒液晶(!)のノートPCで動かしてCの勉強をしてました・・・(^_^;)。
[ メッセージ編集済み 編集者: おばけ 編集日時 2004-08-12 11:56 ]



Apple 社が出している MPW なら利用可能です。ドキュメントは英語ですが。
http://developer.apple.com/tools/mpw-tools/

http://member.nifty.ne.jp/kyoryo/mactip/mpw/index.html
に初期導入の手引きが書いてあります。

ちなみに MacOSX(Tiger) だと Xcode が付属しているんですねぇ。


がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2004-08-12 18:01
ち〜っす。がるです。
うふふふふ。大好きなCの話になってる(笑

はにまるさんに、ちょっとだけヒント。
コード:
void foo(int *data)
{
  *data = 10;
}

int main()
{
int i;
  foo(&i);
}


似たような部分からその差異を洗い出してみてください(笑
ヒントは「通常変数に対してポインタ。ポインタに対してなら
ポインタのポインタ」。

…ヒント出しすぎかな?
頑張ってください〜〜
りばぁ
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 130
お住まい・勤務地: 愛知県
投稿日時: 2004-08-12 18:16
こんにちは。
とりあえず、がるがるさんのすばらしぃヒントを参考に
考え直されることをお勧めして・・・。

引用:

はにまるさんの書き込み (2004-08-12 17:47) より:
回答:
  AllocBuffer関数で確保したメモリ空間を初期化していない事。

理由:
  (1)VBと異なりCでは確保したメモリが自動で初期化されない。
  (2)strcpy関数の操作では複写値にNullポインタが自動付与されない。(多分...)
  (3)長さ指定をしない文字列操作ではNullポインタ(0x00)で文字列の終わりを示す。
  (4)よってprintf関数の%s処理にて"TEXT"の後続に変な文字が表示される。
   または、コアダンプで異常終了する?運がよければセーフ?

如何でしょう?




回答とは関係ないところで少々。
ダブルクォートでくくられた文字列にはヌル文字がちゃんと含まれています。
なので、strcpyで"TEST"を変数にコピッたら「文字列の終わり」って
おっしゃってるやつも分かります。
ちなみにNullポインタって・・・、違いますよ^^;
水無月 遊々
大ベテラン
会議室デビュー日: 2003/10/22
投稿数: 139
お住まい・勤務地: お星様☆彡
投稿日時: 2004-08-12 18:22
ぽんすさんにコメントするときはビクビクもんです。なにを指摘されるやら…(笑)

引用:

ぽんすさんの書き込み (2004-08-12 12:49) より:

「配列名は実はポインタで、逆にポインタに[]を付けて値を参照する
ことも出来たりする」
という誤解が生じる原因はそこでしょう。



確かに誤解ですね(笑)

かなり昔の記憶で申し訳ないのですが、基本は「配列=メモリ上の実体」を差し、「ポインタ=アドレスの間接参照」じゃなかったかなぁ…と。添え字演算子は演算の際に間接参照として展開するから、あたかもポインタのように利用できるけど、実際には似ても非なるものである…と本で読んだ記憶があります(笑) …なにが言いたいのか、よくわからないな(爆)

# うーん。説明するのって難しいですね^^;
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2004-08-12 18:50
がるでふ。追加です。
http://www.m-fr.net/etc/refer.html
大分昔に書いたものなのですが……恥をさらしてみます(笑

# 是非皆様突っ込んでください。光の速さで修正します(爆
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-08-12 19:22
引用:

水無月 遊々さんの書き込み (2004-08-12 18:22) より:
添え字演算子は演算の際に間接参照として展開するから、あたかもポインタのように利用できるけど、実際には似ても非なるものである…と本で読んだ記憶があります(笑) …なにが言いたいのか、よくわからないな(爆)


a[i]は*(a+i)のシンタックスシュガーである、というのを勘違いされているのではないですか。
a[i]とi[a]が交換可能であるというのは有名ですね。
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-08-12 19:31
># 是非皆様突っ込んでください。光の速さで修正します(爆
突っ込めといわれたので突っ込んでみます(笑

>マシン語
アセンブラですね。 マシン語だと 01h 00h 20h
>LD BC 0x200
>LD (BC) 0x200
LD BC,0x200
LD (BC),0x200
# 200h の方が多かったと思います。 Z80はもう0x だったかな

>先ほどのLDCの技
LDCは紹介されていません。 LDですね。
# 別のページで紹介してたらすみません。

古い部分に反応してすみません。
_________________
えムナウ Microsoft MVP for Visual Developer - C#,2005/01-2007/12
えムナウのプログラミングのページ Blog1 Blog2

スキルアップ/キャリアアップ(JOB@IT)