2011-12-09 28 views
-1

どうしたのか教えていただけますか?Cでの動的割り当てエラー

#include <stdio.h> 
#include <stdlib.h> 


void read(int *p,int n) 
{ 
    int *q,i,j; 
    q=p; 
    for(i=0;i<n;i++) 
     for(j=0;j<n;j++) 
     { 
      printf("matrix[%d][%d]=",i,j); 
      scanf("%d",q); 
      q=q+1; 
     } 
    printf("\n"); 
} 

void alocate(int *p,int n) 
{ 
    p=(int*)malloc(n*n*sizeof(int)); 
    if(p==NULL) 
    { 
     printf("Allocation error\n"); 
     exit(1); 
    } 
} 

void realocate(int *p,int n) 
{ 
    p=(int*)realloc(p,n*n*sizeof(int)); 
    if(p==NULL) 
    { 
     printf("Reallocation error\n"); 
     exit(1); 
    } 
} 

void show(int *p,int n) 
{ 
    int *q,i,j; 
    q=p; 
    for(i=0;i<n;i++) 
    { 
     for(j=0;j<n;j++) 
     { 
      printf("%d\t",*q); 
      q=q+1; 
     } 
     printf("\n"); 
    } 
} 

void cleaner(int *p) 
{ 
    free(p); 
} 
int main() { 
    int *p,n; 
    p=NULL; 
    printf("n="); 
    scanf("%d",&n); 
    alocate(p,n); 
    read(p,n); 
    show(p,n); 
    realocate(p,2); 
    read(p,2); 
    show(p,2); 
    cleaner(p); 
    return 0; 
    system("pause"); 
} 

のNetBeans(MinGWの)

RUN FAILED(終了値5)が

信号を受信:sigcodeとSIGSEGVを(?)? (?) プロセスから:? は、プログラムcppapplication_1の場合はPID -1

のVisual Studio:0xc0000005で:0x5c81e42e(msvcr100d.dll)で

未処理の例外をCapp.exeでアクセス違反書き込み場所0x00000000のを。


また、p = NULLを削除すると、主な機能から、それは言う:

ランタイムチェック失敗#3 - 変数 'p'は初期化されずに使用されています。 Capp.exeで0x5b4ee42e(msvcr100d.dll)の未処理の例外:0xC0000005:アクセス違反が0xccccccccに書き込まれました。

+4

私のアドバイスは、デバッグ情報でビルドし、デバッガを使用する方法を学ぶことです。 –

答えて

2

alocate関数は正しくメモリを割り当てますが、ではなく、は割り当てられたメモリへのポインタを返します。あなたは、このようなalocateを使用することになり、あなたのmain機能でこの

int *alocate(int n) 
{ 
    int *p=(int*)malloc(n*n*sizeof(int)); 
    if(p==NULL) 
    { 
     printf("Allocation error\n"); 
     exit(1); 
    } 

    return p; 
} 

のようにそれを修正することができます:

p = alocate(n); 

あなたのrealocate機能と同様の変更を加える必要があります。

0

"p"ポインタ引数を値でallocate関数に渡しています。 これは、メイン関数でallocate関数を初めて呼び出すときに意味します。あなたはNULL値を渡して割り当てます。次に、allocate関数の中でpパラメータを設定するので、pに別の値が与えられますが、allocate関数から戻ると、pの値はmain関数ではまだnullです。

あなたは、main関数のpを更新し、いずれかに割り当てる機能にPへのポインタを渡すか、次のように、この関数でp値を返すようにしたい場合:

int * alocate(int n) 
{ 
    int *p; 
    p=(int*)malloc(n*n*sizeof(int)); 
    if(p==NULL) 
    { 
     printf("Allocation error\n"); 
     exit(1); 
    } 
    return p; 
} 

int main() { 
    int *p,n; 
    p=NULL; 
    printf("n="); 
    scanf("%d",&n); 
    p = alocate(n); 
    read(p,n); 
    show(p,n); 
    realocate(p,2); 
    read(p,2); 
    show(p,2); 
    cleaner(p); 
    return 0; 
    system("pause"); 
} 

REALLOCATE機能を変更する必要があります同じ方法。

+0

ありがとうございます!!!!! – user1089723

0

私が最初に気に入ったエラーは、allocate関数が割り当てをローカルでのみ行うことです。変更します

void alocate(int **p,int n) 
{ 
    *p=(int*)malloc(n*n*sizeof(int)); 
    if(*p==NULL) 
    { 
     printf("Allocation error\n"); 
     exit(1); 
    } 
} 

はこのようにそれを呼び出します。

alocate(&p,n); 

reallocate機能と同じ操作を行います。

理由は、 "参照ではなく"値としてポインタを渡すことです。つまり、allocateでは、それは単なる通常のローカル変数です。関数へのすべての変更は、関数が復帰すると失われます。ポインタのアドレス(&p)を渡すと動作します。

+0

ありがとうございます!!!!! – user1089723

関連する問題