アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんばんは

C言語のポインタについて質問です。
ポインタはインクリメントやデクリメントなどの演算によりアドレスを移動できると解釈しているのですが、他の変数に確保されているアドレスに移動をして、その領域を破壊することはできるのでしょうか?

つまり、

int a = 0; /* 変数aは1000~1004番地(4バイト)に確保されているとする */
char *p ;

としたときに、ポインタpを1004番地に移動をさせて、そこの値を書き換えることはできてしまうのでしょうか?

A 回答 (6件)

>ポインタpを1004番地に移動をさせて


と言うのが具体的にどういう事なのか・・・・・
ですがまぁ、出来てしまいますね
    • good
    • 0
この回答へのお礼

できるのですね。ご回答有り難うございました!

お礼日時:2016/04/30 21:15

ふつうに


int x = 0;
int *p = &x;
*p = 7;
ってやるだけでも「破壊」したことにはなるよね.

あと, 「1000~1004番地」だと 5バイトのような気がします.
    • good
    • 0
この回答へのお礼

あ、確かに。言われてみれば5バイトになっちゃいますね。

ご回答有り難うございました!

お礼日時:2016/04/30 21:14

そこにメモリが存在していれば


出来ます。
    • good
    • 0
この回答へのお礼

できるんですね。ご回答有り難うございます

お礼日時:2016/04/30 21:14

aは1000~1003でポインタを1003番地に移動させてだと思うが。

1003番地を書き換えることはできる。意識的に書き換えるなら破壊とは言わないと思うが。
    • good
    • 0
この回答へのお礼

書き換えられるんですね、ご回答有り難うございます

お礼日時:2016/04/30 21:14

int a=0;


char *p;
p=(char*)&a;
*p=1;
printf("%d\n",a);
とか、やってみては?

C言語の言語仕様としては動く保証がなかったように思うけど、実際の実装ではこれで書き換えできない例はないでしょう。

変数が1000番地とかに割り当てられる処理系が実際にあるかはともかく、
&aが1000番地だったら、上記の後で
*(p+3)=1;
とすれば1003番地が書き変わるでしょう。
ただし、それでaの値がどう変わるかは処理系依存ですね。
# charポインタのインクリメントで番地が1ずつ増えると仮定してます
    • good
    • 0
この回答へのお礼

確かに値が書き換えられました!
ご回答有り難うございます

お礼日時:2016/04/30 21:13

#include <stdio.h>



int main(){
int a = 0; /* 変数aは1000~1004番地(4バイト)に確保されているとする */
char *p;

p = &a;
*p = 2;

printf("a:%d\n", a);
}

[実行結果]
a:2

できるっぽいですね。
上記コードだとコンパイル時に、
「warning C4133: '=': 'int *' と 'char *' の間で型に互換性がありません。」
と出るので、ポインタ(char *p)の型はint * にすべきでしょうけど。
    • good
    • 0
この回答へのお礼

ご回答有り難うございました!

お礼日時:2016/04/30 21:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!