問題タブ [pointer-arithmetic]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 配列を使用したポインタ演算
私はCプログラミングに不慣れで、ポインターの計算に混乱しています。サイズ32の文字の配列があります。これは、文字変数が1バイト大きいため、配列も32バイトであることを意味すると理解しています32 characters * 1 byte = 32 bytes
。問題は、前に説明したように、文字の配列を指しているvoidポインターを持つ関数がある場合です。コードセグメントだと思います
raw_skバッファのすべてのスロットを0に設定する必要があります。ただし、プログラムを実行すると、セグメンテーション違反が発生します。住所にカウントを追加しているのかもしれないと思いました。アドレスに1つ追加すると、配列の次のスロットに移動すると思いました。誰かが私がどこで間違っているのか指摘できますか?私が使用している機能は以下のとおりです。ありがとう!
c - ポインタ・アドレス違い
2 つのアドレスの違いが間違っているのはなぜですか? http://codepad.org/NGDqFWjJ
出力:
c - void* 対 char* ポインター演算
教科書に目を通していますが、そこにあるコードのいくつかについて少し混乱しています。ある部分では、次の方法でポインター演算を実行しています。
しかし、後で、彼らは次のことを行います。
両者は別のものであるべきだと思いますが、同じものとして扱っています。たとえば、配列アクセス(整数配列など)を行う場合、次のようにするため、このように感じます。
この場合、次のバイトではなく、整数配列の次の 4 バイトにアクセスしていませんか? 同様に、void* a がある場合、*(a+1) は次の 4 バイトである必要があると感じています... それともそうではないのでしょうか? ありがとうございました。
c - カスタム malloc にデバッグ ヘッダーを追加する
私はまだCでかなり錆びており、これを理解していません。私がやろうとしているのは、独自の malloc を実装して、割り当てを追跡し、free() への欠落した呼び出しをデバッグできるようにすることです。次のようなヘッダーがあります。
そして、私のカスタム malloc は次のようになります。
しかし、私は明らかにポインター演算が間違っています。ただしvoid* memory
、構造体の最後に a を追加して別の malloc を実行すると、うまくいくように見えますが、問題は、そうするとヘッダーが実際に見つからmy_free
ないことです。基本的にヘッダーを先頭に追加しようとしているので、逆ポインター演算を実行してヘッダーを解放できます。
ここで何が間違っていますか?
objective-c - Objective-C / iOS プログラミングで役立つポインター演算の例はありますか?
C にポインター演算が存在することは知っていますが、iOS の Objective-C プログラミングでポインター演算が役立つ理由の例を誰か挙げてもらえますか? 私は困惑しています...
memory-management - C ++のポインタ演算は、バイト増分ではなくsizeof(type)増分を使用しますか?
C++ でのポインター演算の動作に混乱しています。配列があり、現在の要素から N 要素を進めたいと考えています。C++ ではポインタは BYTES のメモリ アドレスであるため、コードがnewaddr = curaddr + N * sizeof(mytype)
. ただし、エラーが発生しました。newaddr = curaddr + N
後で、すべてが正しく機能することがわかりました。なんでそうなの?address + N * sizeof ではなく、本当に address + N であるべきですか?
私が気づいたコードの一部 (すべてのメモリが 1 つのチャンクとして割り当てられた 2D 配列):
c++ - C / C ++:ポインタ演算
Pointer Arithmeticで少し読んでいたのですが、理解できないことが2つあり、その使い方もわかりませんでした。
そしてまた
誰かが私にそれらを説明してもらえますか、それらはどのように機能し、いつ使用されるのですか?
編集:
私が言いたかったのは、2つのアドレスを取得してそれらを減算すると、それらは何を生成するかということです。
そして、2つのアドレスを取得して比較すると、結果はどうなりますか、またはそれに基づいて比較します
編集:アドレスを減算した結果は理解できましたが、アドレスを比較してもわかりません。
1 <2であることは理解していますが、アドレスが他のアドレスよりもどのように大きいか、およびそれらは何と比較されますか
c - C メモリ割り当ての初期化と処理
ここで私の仕事に問題があります。空きメモリのグローバル ブロックを作成し、malloc する必要があります。型キャストと処理エラーのため、初期化に問題があります。
最初の配列が実際には最初の要素へのポインターである C の配列と同様に、メモリ ブロックは、ポインター演算を使用してメモリ ブロックを検索できる場合と同様である必要があります。
これらのメモリ アドレスへのアドレス/ポインタは、構造体/リンクを介してメモリ ブロックのヘッダーとして格納されます。
c - Cでポインタ減算が未定義なのはいつですか?
これは有効ですか、それとも未定義ですか?
私はそれが有効であると想定していたでしょうが、未定義であると何かを読んだので、グーグルで調べました。これらのリンクは、未定義であると必然的に主張しているようです。
ただし、これらの SO の質問では言及されていません。
これらはすべて、同じ「配列」にある2つのポインターではないことを示しています。それは実際にスタック上の単純な古い C 配列を意味しますか?
定義されていない場合、私には非常に奇妙に思えます... 1 つの定数ポインターと 1 つの移動ポインターにアクセスできるのに、どうして強制的にカウンター変数を持ち歩かなければならないのでしょうか?
c - Cは2次元配列の行のアドレスをどのように取得しますか
2D配列にアクセスするために1つの添え字のみを使用する場合に、Cが行の正しいメモリアドレスを取得する方法を誰かが説明できますか?
例 -
Cで添え字を付けると、実際に行われているのはポインターの追加であるため、1d配列の場合、配列名は要素0を指します。この場合、要素1が必要な場合、コンパイラーは開始アドレス(たとえば4000)を取得します。それに4を追加して(4ビットintと仮定)、返されるのはメモリアドレス4004のアイテムになるようにします。
私の理解では、私の例のように2D配列にデータを入力すると、それらは順番に割り当てられるので、
1
234
アドレス
4000 4004
4008 4012
では、Cは、この場合、array2D [1]が4004ではなく4008を指す必要があることをどのように計算しますか?sizeof()演算子を実行しますか、それともここで基本を誤解しましたか?
前もって感謝します