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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# C# 浮動小数の数値文字列化 1 2022/04/18 15:15
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Linux Cプログラミングを学ぶた...
-
右ビットシフト
-
プログラミングについて。 1つ...
-
プログラミングの授業の課題です
-
Notepad++の関数リスト表示の変...
-
S-JIS → JIS コード変換するには
-
C言語をコンパイルするとコンピ...
-
こんなことてしますか??
-
[C言語]fputsとfprintfの違い
-
これなにがちがうんですか??
-
win10で、正確な待ち時間の作り方
-
システムエンジニアの適正について
-
ArduinoでMouse関数を使用して...
-
gccを行ってもexeファイルが生...
-
C言語 バッファについて。
-
整数1〜99を入力させ、それを英...
-
C言語初心者 ポインタについて...
-
あなたは、Excelはどうやって学...
-
LinuxカーネルのCFSで用いられ...
-
卒業研究でよく分からないとこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列と関数の練習問題
-
システムエンジニアの適正について
-
[C言語]fputsとfprintfの違い
-
C言語をコンパイルするとコンピ...
-
mallocについて
-
どちのほうがすきですか?
-
ArduinoのジャイロモジュールMP...
-
大量のデータを読み込んで表示...
-
gccを行ってもexeファイルが生...
-
VisualStudio2022でC言語プログ...
-
C言語 列挙型(enum型)変数について
-
こんなことてしますか??
-
C言語の関数と配列に関する質問
-
Linuxでの開発環境構築や設定の...
-
質問失礼します。 プログラム言...
-
MACで動く実行ファイルをWindow...
-
WindowsのCapsLock(キャップス...
-
これなにがちがうんですか??
-
卒業研究でよく分からないとこ...
-
gcc13.2のバグ?
おすすめ情報