質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

585閲覧

strcpyでポインタ変数にコピーしたものが違うポインタ変数にも代入されている。

linkinpark

総合スコア42

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/07/29 09:20

c

1コード 2#include <stdio.h> 3#include <stdlib.h> 4#include <string.h> 5int main(){ 6 char *a,*b; 7 int i; 8 9 a=(char*)calloc(20,sizeof(char)); 10 b=(char*)calloc(20,sizeof(char)); 11 strcpy(a,"Graduate School of Information Science and Technology"); 12 for(i=0;i<20;i++){ 13 printf("b[%d]=%c\n",i,b[i]); 14 } 15 return 0; 16}

実行結果
b[0]=c
b[1]=i
b[2]=e
b[3]=n
b[4]=c
b[5]=e
b[6]=
b[7]=a
b[8]=n
b[9]=d
b[10]=
b[11]=T
b[12]=e
b[13]=c
b[14]=h
b[15]=n
b[16]=o
b[17]=l
b[18]=o
b[19]=g

プログラムを動かすとこのような結果になったのですがなぜaにコピーしたものがbにも代入されているのかがわかりません
もしよろしければ教えていただけると幸いです。
どうかよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

aとbの値(アドレス値)を確認してみたらわかるのでは.

aとbはそれぞれメモリ上のどこかを指していて,
あなたはaの指す位置に長い文字列をコピーしろと言った.

その長さは calloc が確保してくれた領域のサイズを超えていて結果としてその領域をはみ出してしまった.
その「はみ出した」場所の一部が b の指す位置と重なっていたら,そういうことが起こり得るだろう.

投稿2021/07/29 10:42

fana

総合スコア11708

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

linkinpark

2021/07/30 01:41

とても分かりやすい説明ありがとうございました! もしまた機会があればよろしくお願いします。
guest

0

"Graduate School of Information Science and Technology"は何文字ありますか?
それに対してaには何文字分の容量が確保されていますか?
それを考えれば危険なコードであることがわかると思います。

投稿2021/07/29 09:24

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

linkinpark

2021/07/29 10:27

20文字分しか確保されていないということはわかっています。 そのあふれた部分がなぜbに代入されているのかがわかりません。
linkinpark

2021/07/29 10:28

a[0]=G a[1]=r a[2]=a a[3]=d a[4]=u a[5]=a a[6]=t a[7]=e a[8]= a[9]=S a[10]=c a[11]=h a[12]=o a[13]=o a[14]=l a[15]= a[16]=o a[17]=f a[18]= a[19]=I b[0]=c b[1]=i b[2]=e b[3]=n b[4]=c b[5]=e b[6]= b[7]=a b[8]=n b[9]=d b[10]= b[11]=T b[12]=e b[13]=c b[14]=h b[15]=n b[16]=o b[17]=l b[18]=o b[19]=g このように間が空いていることもわかりません
linkinpark

2021/07/29 10:28

質問ばかりで申し訳ないのですが教えていただけると幸いです。
itagagaki

2021/07/29 10:37

たまたまです。 1度目のcallocで確保した領域と2度目のcallocで確保した領域が(まあだいたいそうなりますが)たまたま近接していて、aの領域の続きがたまたまbの領域になっているということです。 間が空いているのは、そこにメモリブロック管理用のデータがあったり、メモリ確保に際してアドレスがアライン(整列)されたりすることがあるからです。
itagagaki

2021/07/29 10:38

いずれにしても、これは確保した領域を超えて書き込みを行う破壊的なコードで、決して書いてはいけないコードです。
linkinpark

2021/07/30 01:39

なるほどわかりました! 質問にご返信下さりありがとうございました。 もしまた何か機会がありましたらよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問