
###前提・実現したいこと
calloc使用時に確保したつもりの領域を越えてメモリにアクセスしてしまいます。
確保した領域を越えてメモリにアクセスできてしまう原因をお教えください。
###発生した問題について
c言語でメモリを動的に確保する方法を確認するためにpaiza.ioにて下記のソースコードを実行しました。
calloc関数を使用して構造体のポインタ変数を5個分確保したつもりだったのですが10個分確保できているかのように振るまいます。
確保したつもりの範囲を超えたメモリにアクセスしているように見えます。
確保したメモリをfree関数で開放した際には実行時エラーを出してくれますがそれ以前には何もエラーを出さないようです。
確保した分の範囲を越えてメモリにアクセスしてしまう原因についてお教えいただけないでしょうか?
情報源だけでも結構ですのでどうかよろしくお願いいたします。
###該当のソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3 4typedef struct _xy{ 5 int x; 6 int y; 7}xy_t; 8 9int main(void){ 10 size_t n = 5; 11 size_t m = 10; 12 13 xy_t *xy = NULL; 14 xy = (xy_t *)calloc(n,sizeof(xy_t)); 15 if(NULL == xy){ 16 printf("false\n"); 17 } 18 19 for(size_t i=0;i<m;i++){ 20 xy_t *target = &xy[i]; 21 target->x = i; 22 target->y = i * 2; 23 } 24 for(size_t i=0;i<m;i++){ 25 xy_t *target = &xy[i]; 26 printf("%d %d\n",target->x,target->y); 27 } 28 29 free(xy); 30 xy=NULL; 31 32 return 0; 33 34 35} 36
###出力
0 0
1 2
2 4
3 6
4 8
5 10
6 12
7 14
8 16
9 18
###paiza.ioでの実行時エラー
*** Error in `./Main': free(): invalid next size (fast): 0x000000000150f010 ***
###試したこと
paiza.ioの他にideoneのgcc-5.1とclang 3.7で実行しても同じ出力がでます。
実行時エラーは無し。
webで公開されている情報を調べましたが確保したメモリの二重開放についてぐらいしか見つけられませんでした。
###解決後追記
###実験 配列宣言や動的確保をしなくても基準となるアドレスを渡せば再現できるか?
###実験結果
再現できた。
###実験 ソースコード
c
1#include <stdio.h> 2#include <stdlib.h> 3 4typedef struct _xy{ 5 int x; 6 int y; 7}xy_t; 8 9int main(void){ 10 11 size_t m = 10; 12 13 xy_t origin; 14 xy_t *xy = &origin; 15 16 for(size_t i=0;i<m;i++){ 17 xy[i].x = i; 18 xy[i].y = i * 2; 19 } 20 21 for(size_t i=0;i<m;i++){ 22 printf("%d %d\n",xy[i].x,xy[i].y); 23 } 24 25 return 0; 26 27} 28
###実験 出力
0 0
1 2
2 4
3 6
4 8
5 10
6 12
7 14
8 16
9 18

回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/06/28 13:53