
1 #include <stdio.h>
2
3 void setstr(char *str){
4 str = "abc";
5 return;
6 }
7
8 int main(){
9
10 char *str;
11
12 setstr(str);
13
14 str[1] = 'E';
15
16 printf("str = %s\n", str);
17
18 return 0;
19 }
20
上記のプログラムの動きがいまいち理解できません。
(メモリの状態など)
16行目でprintfすると、結果は「str = 、E・」となります。
---まず、4行目でabcに対してメモリが確保されて、その先頭アドレスが
strに設定されます。
しかし、setstr関数を抜けた時点で、先ほど確保されたメモリは開放されて
しまう。(? ここは想像です。確証がありません)
main関数に戻ってきて、14行目で変更しているメモリは、abcがかつてあった
場所の"b"の部分。(str自体は何も変更されていないから)
16行目でprintfしているのだけど、なぜこの結果になるのかが分かりません。。
分かる方いましたら教えて下さい。上の文章では何を言っているのか分かりづらいとは
思いますが。。
説明には適宜行番号を使って頂いて構いません。
よろしくお願いします。
No.3
- 回答日時:
ANo2です。
追記です。C言語は値渡しですから呼び出し先で引数(この場合はstr)に値を入れても、呼び出し元ではstrの内容は変更されていません。
void main()
{
char *str;
str = 0x00;
func(str);
}
void func(char *str)
{
str=0x01;
}
こう書いてもfuncの呼出し後のstrの値は0です。
void main()
{
char *str;
str = 0x00;
*str = 0x30;
func(str);
}
void func(char *str)
{
*str=0x31;
}
これであればstrの指し示している内容は0x31に変更されます。
ご回答ありがとうございます。
ポインタ自身は、変更することができないが、
ポインタが指している先は変更することができるという
ことかな。。
No.2
- 回答日時:
プログラムの意図はわかりますが、ポインタをリテラルのアドレスで初期化することは出来ません。
結局は、ANo1さんの言う通り14行目でメモリの内容を破壊しています。
No.1
- 回答日時:
ひとまず setstr() の実装は忘れて、main の中だけ考えましょう。
char 型のポインタ変数 str を宣言していますが、str の指す先は存在していません。
setstr() は char型のポインタ変数を受け取りますが、それがどのような実装であろうと、
存在しないものを変更することはできません。
そして、str[1] = 'E'; で「存在しないはずのどこか」を破壊しています。
printf() ではその破壊された様子が見えているのです。
ご回答ありがとうございます。
strを宣言した時点では、NULLで初期化もしていないので、
何か不定値が入っているんですね、きっと、、
そしてその不定値をアドレスとして見て、そこらへん(不定値+1)の
メモリを書き換えてしまっているということですね。とてもシステムに
とって危険な香りがします。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DLLファイルの逆コンパイラにつ...
-
【C言語】全角文字の配列を、全...
-
プログラマー達は何故、プログ...
-
C# で 数式文字列処理を処理す...
-
C言語 関数、変数の宣言について
-
プログラミングc++を全く分か...
-
逆コンパイルと逆アセンブルの...
-
大量のデータを読み込んで表示...
-
C言語の関数のextern宣言
-
C言語について(初心者)
-
プログラマーです。このDB設計...
-
C#でログファイルにファイルパ...
-
c言語
-
いまc言語の標準ライブラリ文字...
-
ペーパーマリオみたいにドット...
-
プログラミング 2つの整数を読...
-
visual studio 2022でのC#プロ...
-
PIC12F1822でLED調光器を作りたい
-
最初に聞かれたこと
-
あってる
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語
-
DLLファイルの逆コンパイラにつ...
-
Windows Formアプリからコンソ...
-
大量のデータを読み込んで表示...
-
C言語の関数のextern宣言
-
VisualStudioでC++クラスを追加...
-
【C言語】全角文字の配列を、全...
-
VisualStudio2022でC言語プログ...
-
C++でデスクトップGUIアプリ開...
-
gccを行ってもexeファイルが生...
-
C#でTreeViewのCheckBoxのサイ...
-
C#でログファイルにファイルパ...
-
プログラマー達は何故、プログ...
-
逆コンパイルと逆アセンブルの...
-
Notepad++の関数リスト表示の変...
-
C言語について。
-
Cのコンパイルでコメントアウト...
-
visual studio 2022でのC#プロ...
-
コンソールアプリを作成するの...
-
C言語 バッファについて。
おすすめ情報