ほとんどの場合、Cでメモリを割り当ててメモリを操作する方法を学んでいます.gccを使用してコンパイルし、nanoをエディターとして使用しています。コードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
static int *ip, i;
main (){
ip=(int *)malloc(10*sizeof(int));
for(i=0;i<10;++i){
scanf("%d",ip++);
}
free(ip);
return EXIT_SUCCESS;
}
コンパイラを呼び出すときは、次のコマンドでコンパイルします: cd Desktop/C/learn; gcc -W -Werror malloc.c -o run; 。/走る
プログラムは正常にコンパイルされますが、for ステートメントが終了し、フリー (ip) ポインターが呼び出された後、コンパイラーは次を返します。
*** glibc detected *** ./run: free(): invalid pointer: 0x088ec030 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb75e9ee2]
./run[0x80484ce]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb758d4d3]
./run[0x80483d1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:06 23330986 /home/phox/Desktop/run
08049000-0804a000 r--p 00000000 08:06 23330986 /home/phox/Desktop/run
0804a000-0804b000 rw-p 00001000 08:06 23330986 /home/phox/Desktop/run
088ec000-0890d000 rw-p 00000000 00:00 0 [heap]
b753f000-b755b000 r-xp 00000000 08:06 14418881 /lib/i386-linux-gnu/libgcc_s.so.1
b755b000-b755c000 r--p 0001b000 08:06 14418881 /lib/i386-linux-gnu/libgcc_s.so.1
b755c000-b755d000 rw-p 0001c000 08:06 14418881 /lib/i386-linux-gnu/libgcc_s.so.1
b7573000-b7574000 rw-p 00000000 00:00 0
b7574000-b7717000 r-xp 00000000 08:06 14418860 /lib/i386-linux-gnu/libc-2.15.so
b7717000-b7719000 r--p 001a3000 08:06 14418860 /lib/i386-linux-gnu/libc-2.15.so
b7719000-b771a000 rw-p 001a5000 08:06 14418860 /lib/i386-linux-gnu/libc-2.15.so
b771a000-b771d000 rw-p 00000000 00:00 0
b7731000-b7735000 rw-p 00000000 00:00 0
b7735000-b7736000 r-xp 00000000 00:00 0 [vdso]
b7736000-b7756000 r-xp 00000000 08:06 14418840 /lib/i386-linux-gnu/ld-2.15.so
b7756000-b7757000 r--p 0001f000 08:06 14418840 /lib/i386-linux-gnu/ld-2.15.so
b7757000-b7758000 rw-p 00020000 08:06 14418840 /lib/i386-linux-gnu/ld-2.15.so
bff5b000-bff7c000 rw-p 00000000 00:00 0 [stack]
Aborted
なぜこれが起こっているのか、どうすればこれを回避できるのか疑問に思っています。私の方法は記憶に優しくありませんか? ここで何が起こっているのですか?
コードを書き直して機能させるにはどうすればよいですか?
私は本やチュートリアルなどから学んでいません。私が言語を学ぶ方法は、コンパイラや IDE のソース コード、または言語の書き方を読んで、そこから学ぶことです。なので、参考になるものは特にありません。誰でもこれを修正する方法を知っていますか?
どうもありがとうございます!〜フォックス