現在C言語のポインタに関して勉強しているのですが、下記のコードを実行したところ、
ダブルポインターを関数の引数にしたコードは、free
したあとに、NULL
埋めを行うと、関数を抜けたあとも、きちんと(null)
という実行結果を得られたのですが、ポインターを関数の引数にしたコードでは、関数を抜けても1234567890
が残ったままになっていました。
配列を関数の引数に取るとポインタの先頭のアドレスを渡すので、NULL
埋めを行っても同じ結果になるのではないかなと思っていました。
そこで質問なのですが、
- なぜその様になるのかの理由を教えてもらいたいです。
- なぜ
free
はうまくいってNULL
埋めがうまく行かないのか?
上記の2点お答えいただきたいです。
よろしくおねがいします。
実行環境は、
clang version 11.0.0
Target: x86_64-apple-darwin20.1.0
Thread model: posix
InstalledDir: /usr/local/Cellar/llvm/11.0.0/bin
llvmを使ってメモリリークチェックを行いました。
Mac OS
main.c
c
1void freedblptr(char **dptr){ 2 printf("&dptr = %p\n", *dptr); 3 free(*dptr); 4 *dptr = NULL; 5 printf("&dptr = %p\n", *dptr); 6} 7 8int main() 9{ 10 char *test = (char *)malloc(sizeof(char) * (10 + 1)); 11 char *tmp = "1234567890"; 12 int i = 0; 13 while(i<10){ 14 test[i] = tmp[i]; 15 i++; 16 } 17 test[i] = '\0'; 18 printf("test = %s\n", test); 19 printf("test &ptr= %p\n", test); 20 21 freedblptr(&test); 22 23 printf("test = %s\n", test); 24 printf("test &ptr= %p\n", test); 25 26 return 0; 27}
shell
1$ clang -g -fsanitie=leak main.c 2$ ./a.out 3test = 1234567890 4test &ptr= 0x7fac88405d40 5&dptr = 0x7fac88405d40 6&dptr = 0x0 7test = (null) 8test &ptr= 0x0
main2.c
c
1void freeptr(char *ptr) 2{ 3 printf("&ptr = %p\n", ptr); 4 free(ptr); 5 ptr=NULL; 6 printf("&ptr = %p\n", ptr); 7} 8 9int main() 10{ 11 char *test = (char *)malloc(sizeof(char) * (10 + 1)); 12 char *tmp = "1234567890"; 13 int i = 0; 14 while(i<10){ 15 test[i] = tmp[i]; 16 i++; 17 } 18 test[i] = '\0'; 19 printf("test = %s\n", test); 20 printf("test &ptr= %p\n", test); 21 22 freeptr(test); 23 24 printf("test = %s\n", test); 25 printf("test &ptr= %p\n", test); 26 27 return 0; 28}
shell
1$ clang -g -fsanitie=leak main2.c 2$ ./a.out 3test = 1234567890 4test &ptr= 0x7fccd4c05d40 5&ptr = 0x7fccd4c05d40 6&ptr = 0x0 7test = 1234567890 8test &ptr= 0x7fccd4c05d40
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/14 03:12 編集
2020/12/14 03:50
2020/12/14 06:00