C言語のポインタわかったわ!!!!
■ このスレッドは過去ログ倉庫に格納されています
これをかけたらもう完全に理解してるやろ
int *p;
int a = 11;
p = &a;
*p = 22;
return a; 凄いけど今使うの?
ポインタってパソコンが貧弱だった頃のロストテクノロジーでしょ
今のつよつよPCで出番あるの? あとはポインターの足し算引き算
ポインターと多次元配列の関係が理解出来てればOK ポインタはmallocとかと組み合わせてからが本領 シューティングゲームとかでリストでしか使った事無いから分からないな
今だと強引に配列とforで回してもそんなに処理落ちしないでしょ >>6
多次元配列はわからんなぁ
ポインタの配列作るの? >>7
何もみずに書いてみたけど合ってる?
int *a = malloc(20);
*a = "Hello";
printf("%s", *a); >>8
cってそのへんのデータ構造自分で実装することになるから勉強になるよな
他の言語だと勉強にならん >>9
うーん。
シューティングゲームで敵のオブジェクトの配列を処理するときに、ポインタ渡すとかある気がする
最近の言語でも大体これと同等のことやる気がする
毎フレームオブジェクトを複製してたら詰まない? >>12
合ってない
まずmallocの戻り値はvoid*だから、変数へ代入する前にキャストしなきゃ
それからせっかくmallocしたのが次の代入でムダになってる
これ典型的なメモリーリークだから >>16
どうしたらいいの?こんな感じ?
void *a = molloc(20);
a[0] = 'H'
a[1] = 'e'
a[2] = 'l'
a[3] = 'l'
a[4] = 'o'
a[5] = '\0' WINAPIとかによくある返り値とは別になんか出力する用のポインタ渡すやつ そうかぁ
これだと"Hello"がデータ領域にあるからヒープ領域指し示してないのか
たしかにメモリリークしてるわ
やべー
全然Cわかってねぇ
int *a = malloc(20);
*a = "Hello";
printf("%s", *a); mollocで獲得したヒープ領域にデータ書き込むのってどうしたら良いんだ、
なんか完成あるのか??
strcpyとかあったっけ? これでどうや!
おじいちゃん!添削たのむ
char *a = molloc(20);
strcpyn(*a, "Hello", 6);
print("%s", *a); >>18
strncpy()かmemcpy()を使う
セキュリティーホール作りやすいところだから慎重に
詳しくはman string_copying
危険すぎるのでいまは直接malloc()やstrncpy()を叩いたりしないかもしれない
可変長文字列を安全に扱ってくれるライブラリーを利用すべきだと思う >>23
たしかに危険だね
びっくりしたわ
こんな簡単にメモリリークするとは… C言語はウホホウホホと言いながら石器でなんでも作れるような原始人のおっさんに任せて
新人はモダンな言語を扱うべき >>25
俺も原始人になりたい
石器で全てを作りたいんだよ >>22
strncpyがstrcpynになってるのはご愛嬌として
第3引数の"6"が間違ってたらたちまちセキュリティーホールと化す
ASCII文字列の場合は数えれば5文字+NUL文字だと分かるが、国際化文字列だとどうしようもない
文字列処理はC言語の鬼門だから、もっと慣れてからでもいいと思う >>26
Linuxカーネル開発に飛び入りできるような天才でなければ
C言語には泥みたいな仕事しか残ってないよ >>27
今回は6で合ってるよね?
mollocで20 Bytes文確保して
5Bytesコピーして最後に\0を追加してるから
合ってるよね? >>28
Linuxカーネルの開発がしたい
泥仕事はやりたくない 原始人が根気と時間を掛けてできるのは火起こしまで
電子レンジ高圧鍋使いたかったらライブラリ使え >>32
それな
俺も何回か挑戦してるけど毎回わからんなくなる
昨日からまた再挑戦してる でもさ、C言語ってかっこよくない??
GNUとかほとんどCで実装されてるしすごいじゃん Rustは流行ってるけど、RustでUnixを再実装とかまだ出来てなくない??
結局Cじゃん デバイスドライバ作ってたとき、カーネルモードでのある処理の仕方が解らなくて似たようなことやってるカーネルのある部分のソースを追っかけたことはあった >>33
ソースがUTF-8でエンコードされていると仮定すれば
もしもこのソースが1文字=1バイトでないエンコーディングでセーブされたら、もう正しくなくなってしまう
要はソースの中に文字列リテラルや"6"みたいな数字を書いてはいけないってことよ 実際のコードでそのへん触っことないわ
組み込みとかで使うんかな? >>41
な、なるほど、文字コードのバイト数まで考えなきゃいけないのかぁ
なるほど、strlenで文字列の長さ取ってきてstrncpyしたらいいの? いまどきCってどんな感じの仕事になるんだろ
MS-DOS時代とかって印象が強いわ >>45
アセンブラじゃなくCじゃなきゃいけない
って仕事がどうもピンとこないんだよね てか、みんなが毎日叩いてるlsコマンドだってCで実装されてるんだぞ
MacもLinuxもFreeBSDもOpenBSDも全部ls.cで実装されてる
つまりCは毎日使われてんだよ
つまりC is God >>43
C言語における文字列の構造(ヌル終端文字列)を勉強し直すように
「番兵法」も一緒に勉強しておくと良い 組み込みと言っても千差万別よ
Linuxカーネル乗っけたような大げさな「組み込み」もあるから
洗濯機や炊飯器でmallocみたいな動的メモリー割り当ては使わんだろうなあ
もっと安全で、再現性のあるメモリ管理ライブラリ作って使うと思う
組み込みとは違うけどメモリーが貴重な状況、
例えばLinuxカーネルの中には、メモリ割り当て関数がいくつもある
用途ごとに異なるメモリ割り当てのアルゴリズムを使って最適化してる 車載とかってどうなんだろうね
これから自動運転する中で車にもLinuxが搭載されると思うんだけど、そうなったら俺のC言語の才能が爆発して、超すごい車作れるかもしれないじゃん ポインタの配列使えるようになったら一人前
用途も含めてね えー
windowsになるのぉ
それじゃあつまらなくて誰も買わんよ
せめてFreeBSDにしてよ int* a,b;
int n = 123;
a = &n
b = a; >>2
ダブルポインタ、トリプルポインタいってみよう ■ このスレッドは過去ログ倉庫に格納されています