|
メインの位置で、領域を確保する変数を宣言し、関数にて領域を確保し
値を設定して、領域を返そうとしているのですが、上手く返却されませ
ん。
領域を確保しているとことでは、正しく値が格納されているのですが、
戻った先では、NULLとなります。
fun_start(str,10) ;
を
fun_start(&str,10) ;
とするとコアダンプしてしまいます。
何がいけないのでしょうか。
また、free()について聞きたいのですが、
free()は、領域を開放するだけであって、malloc()やrealloc()によって
確保された領域の先の中身までも開放(破棄)してくれるわけではないの
ですね。
プログラムが終了しないかぎりは、なんどでも参照できるものなのでしょ
うか。
もし、そうであった場合、参照できないようにするにはどうしたらよいの
ですか。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int fun_start(char **, int) ;
int fun_disp(char **, int) ;
main()
{
char **str = NULL ;
int i ;
fun_start(str,10) ;
fun_disp(str,10) ;
printf("\nmalloc領域解放\n") ;
for(i=0; i<10; i++) {
free(str[i]) ;
}
free(str) ;
}
int fun_start(char **str,int num)
{
char buf[1024] ;
int size = 1024 ;
int n = 0, i,j ;
for(i=0 ; i<num ; i++) {
if (str == NULL || n >= size) {
str = realloc(str, (size *= 2) * sizeof(char *)) ;
if (str == NULL) return puts("out of memory"), 1 ;
}
memset(buf,'\0',sizeof(buf)) ;
memset(buf,'a',i+1) ;
str[n] = strdup(buf) ;
if (str[n] == NULL) return puts("out of memory"), 1 ;
n++ ;
}
}
int fun_disp(char **str,int num)
{
int i ;
for(i=0 ; i<num ; i++) {
printf("[%s]\n",str[i]) ;
}
}
|