reallocの使い方に関するエラー

このQ&Aのポイント
  • reallocを使用して配列のサイズを2倍に増やすプログラムでセグメンテーションフォルトが発生しています。
  • realloc関数の引数に間違いがある可能性があるため、セグメンテーションフォルトが発生していると思われます。
  • 記載されているコードでは、reallocの第2引数にsizeof(narray)*2と指定しており、間違ったアドレスを渡しているためにエラーが発生しています。
回答を見る
  • ベストアンサー

realloc

reallocの使いかたに関してです。 #include <stdio.h> #include <stdlib.h> main () { int narray[5]; int *pn, *pn2; pn=narray; printf("%p <=> ",pn); printf("%p\n",narray); memset(pn,0,sizeof(int)*5); if((pn2 = (int *)realloc(pn, sizeof(narray)*2))==NULL){ printf("error"); exit(0); } pn=pn2; memset(pn,0,sizeof(int)*5*2); printf("realloc!\n"); return(0); } この記述はどこかまちがっているでしょうか? 最初の配列のサイズを2倍に増やすというだけのぷろぐらむなのですが。 どうもreallocの場所でセグメンテーションフォルトになります。

質問者が選んだベストアンサー

  • ベストアンサー
  • gimmick
  • ベストアンサー率49% (134/270)
回答No.1

realloc()の第一引数で渡すのは、malloc()、calloc()、realloc()を用いて確保した領域へのポインタです。

参考URL:
http://www9.plala.or.jp/sgwr-t/lib/realloc.html
unchikun
質問者

お礼

ありがとうございます。あらためて先ほど書籍をみたところ、そうかいてあったのですが見落していました^^;

関連するQ&A

  • reallocについて

    現在、領域を拡張しながら、 ファイルを読み込んで呼び元に返却するPGを作成しています。 reallocがうまくいかないので、試しに小さいのを作って みましたが、これだとreallocの2度目で落ちます。 100文字ずつ呼んでいるので、拡張も100文字ずつ行っています。 メモリ確保に失敗なら、まだ分かるのですが、 ちょっと理由がわかりません。 reallocを複数繰り返していることも問題だと思いますが、 まずは正常に処理を流したいと考えています。 よろしくお願いします。 ~~~~~~ソース~~~~~~~~ //ファイルを読み込んでから領域を確保する #include <stdio.h> #include <string.h> #include <stdlib.h> #define BUFF 100 int main() { FILE *fp; char tmp[BUFF+1]; char *str; int len = 0; fp = fopen( "c:/test.txt" , "rb" ); if(fp ==0){ printf("ファイルがありません\n"); return -1; } //領域を初期化 str = (char *)malloc(1); memset(str,'\0',sizeof(str)); while(feof(fp)==0){ memset(tmp,'\0',sizeof(tmp)); fgets(tmp,BUFF,fp); //領域を再確保 len += BUFF+1; if(NULL == ((char *)realloc(str,len))){ printf("メモリ確保エラー"); } //読み込んだ値を変数に追加 strcat(str,tmp); } printf("文字列\n\n%s\n",str); printf("長さ:%d\n",len); fclose(fp); return 0; }

  • reallocの使い方について

    C言語初心者です。malloc()で確保した領域をrealloc()にて拡張しました。以下、わからないことがあるので教えて下さい。 #include <stdio.h> #include <stdlib.h> int main(){ int *array1; array1=malloc(sizeof(int)*3); for(int i=0; i<3; i++){ *(array1+i)=i; } int *array2=array1; for(int i=0; i<3; i++){ printf("array2[%d]: %d\n", i, array2[i]); } array1=realloc(array1, sizeof(int)*5); for(int i=3; i<5; i++){ array1[i]=i; } for(int i=0; i<5; i++){ printf("array2[%d]: %d\n", i, array2[i]); } } 上記のソースコードでは、私が期待したのは array2[0]: 0 array2[1]: 1 array2[2]: 2 array2[0]: 0 array2[1]: 1 array2[2]: 2 array2[3]: 3 array2[4]: 4 なのですが、実行すると次のように表示されます。 array2[0]: 0 array2[1]: 1 array2[2]: 2 array2[0]: 0 array2[1]: 1 array2[2]: 2 array2[3]: 0 array2[4]: 1 まず最初に、array1という名前のポインタをつくり、malloc関数にて整数3つ分の領域を確保し、整数0、1、2を投入する。次に、array2という名前のポインタをつくり、array1と同じ領域を指すようにする。なので、array2にはデータを投入しなくても参照すると既に0、1、2が入っている。 次に、realloc関数にて領域を2つ追加する。追加された領域には、array1ポインタ経由で実データに整数3、4を投入する。実データが変更されたので、array2ポインタ経由でデータを参照すると、0、1、2、3、4が参照出来る、と思ったのですがそうなっていません。array1ポインタ経由で見ると、きちんと0、1、2、3、4が参照出来るのですが。。 私のreallocの理解に誤りがあれば教えて下さい。宜しくお願いします。

  • C言語のポインタ

    あまり意識せずにポインタを使っているせいか,次のプログラムではまってしまいました. #include<stdio.h> #include<stdlib.h> int main(void) {  int *p, q;  p = (int *)malloc(sizeof(int));  q = (int *)malloc(sizeof(int));  *p = 2;  printf("%d\n", *p);  return 0; } コンパイルエラーで実行ファイルが出力されません. このプログラムで変数qはなぜポインタじゃないのでしょうか? 次にtypedefでptr_intという型を定義したプログラムは, 上のようなエラーが出力されず,期待とおりの結果になりました. #include<stdio.h> #include<stdlib.h> typedef int* ptr_int; int main(void) {  ptr_int p, q;  p = (int *)malloc(sizeof(int));  q = (int *)malloc(sizeof(int));  *p = 2;  *q = 3;  printf("%d\n", *p);  printf("%d\n", *q); return 0; } typedefすることでなぜエラーを回避することができるのでしょうか? よろしくおねがいします.

  • reallocの使い方について

    下記コードを実行すると,abendしてしまいます. 本来,alloc_testでは,htmlを取得して戻したい(htmlのサイズは可変)のですが,伸張ができず悩んでおります.ヒント等ご教示いただければ幸いです. また,修正方法の他,何故,下記コードがまずいのかについてもご説明いただければと思います. なお,コメントアウトにもあります通り,配列サイズを十分に大きくとり,reallocの処理を入れないなどの回避方法は望んでいません. //--ここから(全角スペースを使用しています) #include <stdio.h> #include <stdlib.h> int alloc_test(char *c){  char *t;  t=(char *)realloc(c, sizeof(char) * 100);  if(NULL==t)   return -1;  c=t;  return 0; } int main(void){  char *a="\0";  alloc_test(a);  return 0; } //--ここまで よろしくお願いいたします.

  • reallocとstrtokの併用について

    fscanfで文字列を読み込み、strtokでカンマ区切りにするという関数を作りたいのですが、 reallocすると先頭から徐々にデータが文字化けしていきます。 まず最初に4つ分のchar*を取ります。 もし、5つ目が見つかったらさらに4つ増やし、9つ目が見つかったらさらに。。。というようになっております。 n個目の判定はcntがn-1で真になり、reallocが成功したら個数を増やすようになってます。 5つ目が見つかった時点では出力に問題は無いのですが、6個目から侵食が始まっていきます。 原因がどうしても自分では分からなかったので、誰かお願い致します。 words.txtの内容(末尾改行なし) iii,jjj,kkkkkkkkk,l,m,n,ooooo,pppppppp,a,s,d,f,g main.c #include<stdio.h> #include<stdlib.h> #include<string.h> #include"C:\borland\bcc55\Include\malloc.h" int readlinefile(FILE *fp,char **words){ int cnt=0,len; char *line=(char *)malloc(256); char *tmp; if(line==NULL) return 0; if(fscanf(fp,"%s",line)!=EOF){ if((tmp=(char *)realloc(line,sizeof(char)*(strlen(line)+1)))==NULL){//できるだけメモリを節約してみる return 0; }else{ line=tmp; } len=strlen(line); printf("line:%d:%d:%s\n",len,_msize(line),line); if(len>1){//ファイル終端の改行を排除 int i; char *tok=strtok(line,",");//カンマで区切ったアドレスを得る while(tok){ if(cnt==0)printf("tok:1st:%x\n",tok); if(cnt>3&&cnt%4==0){//サイズが足りなくなった時 char **tmp2; if((tmp2=(char **)realloc(words,sizeof(char *)*(4+4*(cnt%4))))==NULL){ printf("words realloc ERROR\n"); break; }else{ printf("realloc\n"); words=tmp2;//reallocを適用 } } words[cnt]=tok; if(cnt){ printf("line(func)"); for(i=0;i<len+1;i++){ printf("%c",words[0][i]); } printf("\n"); } tok=strtok(NULL,","); printf("words[%d]:%x:%s\n",cnt,words[cnt],words[cnt]); printf("\n"); printf("tok:%d回目:%x\n",cnt+1,tok); cnt++; } return cnt;//正常終了した }else{ free(line); } } return 0; } int main(){ FILE *fp=fopen("words.txt","r"); if(fp){ int cnt=1; while(cnt){ int i; char **words=(char **)malloc(sizeof(char *)*4); words[0]=NULL; cnt=readlinefile(fp,words); printf("mainに戻りました\n"); if(cnt) printf("words:%d\n",cnt); for(i=0;i<cnt;i++){ printf("words[%d]:%x:%s\n",i,words[i],words[i]); } free(words[0]); words[0]=NULL; printf("\n"); free(words); } }else{ printf("file open ERROR\n"); } return 0; } 実行結果 なぜかコピペできないので実行するか斧でダウンロードお願いします。 http://www1.axfc.net/u/3352789.txt 全てまとめたもの http://www1.axfc.net/u/3352796.zip

  • reallocについて

    以下のソースでmallocやreallocの使い方で間違った部分があれば 指摘してください。 #include <iostream.h> #include <malloc.h> typedef unsigned char byte; main() { byte *p = (byte*)malloc(10); memcpy(p, "123456789", 9); p = (byte*)realloc(p, 5); *(p+4) = 0; printf("%s", (char*)p); p = (byte*)realloc(p, 0); return 0; } realloc(p, 5)のようにreallocでメモリブロックを10から5に 小さくしてもいいんですか? 足りなくなったメモリを増やすためのreallocしか見たことがありません。 reallocでは先頭バイトの位置が保たれていることは保証されますか? 別の言い方をすると、memcpy(p, "123456789", 9);によって 1が入ってるバイトを、reallocした後の*pが差すことが保証されていますか? もし保証されるなら、例えば上記のソースで1234と表示される 別の言い方をすると、reallocでメモリブロックの値は変更されない ことは保証されていますか?

  • 引数で指定された配列の要素数の取得

    どうもこんにちは。 C言語でプログラムを作成しています。 ある関数に配列を渡すことを考えていますが、渡した配列の要素数を取得する方法は何かありますか? 標準の関数を見ても、配列の先頭アドレスのポインタとともに、配列の要素数を渡しているものばかりで、配列のポインタを渡しているものは見かけません。 要素数があらかじめわかっていれば、それを引数の型に指定できますが、呼び出されるまで不明な場合はうまくいきません。 配列の要素数も引数として一緒に渡す必要がありますか? [作ってみたサンプル] #include <stdio.h> #include <stdlib.h> #include <string.h> // func1 と func2 をまとめられないだろうか。。。 void func1(int (*p)[10]) { ________int n = sizeof(*p) / sizeof((*p)[0]); ________int i; ________for (i = 0; i < n; i++) { ________________printf("%d\n", (*p)[i]); ________} ________printf("\n"); } void func2(int (*p)[5]) { ________int n = sizeof(*p) / sizeof((*p)[0]); ________int i; ________for (i = 0; i < n; i++) { ________________printf("%d\n", (*p)[i]); ________} ________printf("\n"); } int main(int argc, char *argv[]) { ________int ary1[10] = { 2, 4, 6, 8, 0, 1, 3, 5, 7, 9 }; ________int ary2[5] = { 3, 6, 9, 12, 15 }; ________func1(&ary1); ________func2(&ary2); ________return 0; }

  • メモリ確保の謎。

    C言語のメモリの確保の所でふと疑問に思ったのですが、 malloc,calloc,realloc,memset,memcpyなどの関数を使うときって #include <stdio.h> #include <stdlib.h> #include <memory.h> #include <malloc.h> とか書かないといけないと本にはありますが、#include <stdio.h>だけで なんのエラーにもならずに実行できてしまうのはなぜでしょうか? 実際のプログラムにはmallocとreallocしか使ってないのですが、#include <stdio.h>でできてしまいます。 でも教科書には他にも書かなきゃいけないとかいてありますが、なぜ書かなくても実行できてしまうのでしょうか?

  • reallocでエラー

    reallocを使うとエラーがでます。 簡単なreallocのプログラムでもエラーがでて、realloc自体が使えないような感じです。 どうしたらよいでしょうか? 試したプログラムは #include<stdlib.h> #include<stdio.h> #include<string.h> int main(void){ char *p; p=malloc(17); if(!p){ printf("error\n"); exit(1); } strcpy(p,"これは16文字です"); p=realloc(p,18); if(!p){ printf("error\n"); exit(1); } strcat(p,"."); printf(p); free(p); return 0; } というもので、 *** glibc detected *** ./test: realloc(): invalid next size: 0x09b61008 *** ======= Backtrace: ========= /lib/libc.so.6[0x43ca2f] /lib/libc.so.6(realloc+0xfe)[0x43e68e] /lib/libc.so.6[0x43ea61] /lib/libc.so.6(realloc+0x3c)[0x43e5cc] ./test[0x8048512] /lib/libc.so.6(__libc_start_main+0xe0)[0x3e8f70] ./test[0x80483e1] ======= Memory map: ======== 00235000-0023f000 r-xp 00000000 fd:00 360450 /lib/libgcc_s-4.1.2-20070626.so.1 0023f000-00240000 rwxp 00009000 fd:00 360450 /lib/libgcc_s-4.1.2-20070626.so.1 003d3000-00521000 r-xp 00000000 fd:00 360473 /lib/libc-2.6.so 00521000-00522000 r-xp 0014e000 fd:00 360473 /lib/libc-2.6.so 00522000-00524000 rwxp 0014f000 fd:00 360473 /lib/libc-2.6.so 00524000-00527000 rwxp 00524000 00:00 0 00616000-00631000 r-xp 00000000 fd:00 360466 /lib/ld-2.6.so 00631000-00632000 r-xp 0001a000 fd:00 360466 /lib/ld-2.6.so 00632000-00633000 rwxp 0001b000 fd:00 360466 /lib/ld-2.6.so 006c0000-006c1000 r-xp 006c0000 00:00 0 [vdso] 08048000-08049000 r-xp 00000000 fd:00 3473718 /home/gucchi/test/test 08049000-0804a000 rw-p 00000000 fd:00 3473718 /home/gucchi/test/test 09b61000-09b82000 rw-p 09b61000 00:00 0 b7e00000-b7e21000 rw-p b7e00000 00:00 0 b7e21000-b7f00000 ---p b7e21000 00:00 0 b7fd6000-b7fd8000 rw-p b7fd6000 00:00 0 bfb07000-bfb1c000 rw-p bfb07000 00:00 0 [stack] アボートしました というエラーがでます。 試しに他の環境でコンパイルしたら実行できちゃいました。 glibcに問題があったりするんでしょうか? ご教授ください。

  • C free関数の開放について。

    独学でCを勉強し始めてる初心者です。 以下の構文で、最後に、 free(p); とあり、確保したメモリ「p」を開放していますが、 確保したメモリ「q」は開放しなくて良いのでしょうか? この場合は同じ部分のメモリを確保しているからqは開放しなくて良いということなんでしょうか…宜しくお願い致します。 #include <stdio.h> #include <stdlib.h> int main(void) { int *p; p=malloc(sizeof(int)*3); if(p==NULL) exit(1); p[0]=10; p[1]=20; p[2]=30; printf("%d\n",p[0]+p[1]+p[2]); free(p); return=0; }

専門家に質問してみよう