2012-05-11 20 views
-1
typedef struct{ 
    int number; 
    char name[100]; 
} Apple 

typedef struct{ 
    Apple *apple; 
    int bit[2]; 
} AppleArray; 

int main(){ 
    AppleArray *aArray; 
    loadApple(&aArray); 
} 

loadApple(AppleArray **aArray){ 
    *aArray = NULL; 
    for(i=0; i<100; i++){ 
    *aArray = realloc(*aArray, (i+1) * sizeof(AppleArray)); 

    /*SEGFAULT here*/ 
    aArray[i]->apple = NULL; 

    for(j=0; j<2; j++){ 
     aArray[i]->apple = realloc(aArray[i]->apple, sizeof(Apple) * (j+1)) 
    } 
    } 

} 

特定のサイズのAppleArrayが必要です。各AppleArrayにはAppleが2つあります。しかし、私はNULLをaArray [i] - > appleに割り当てるとsegfaultを取得します。そこには何が問題なのですか?構造体配列内の構造体の値を取得する

EDIT:

loadApple(AppleArray **aArray){ 
    *aArray = malloc(100 * sizeof(AppleArray)); 
    for(i=0; i<100; i++){ 

    /*SEGFAULT here*/ 
    aArray[i]->apple = NULL; 

    for(j=0; j<2; j++){ 
     aArray[i]->apple = realloc(aArray[i]->apple, sizeof(Apple) * (j+1)) 
    } 
    } 
} 
+0

私はそれが* aArray [i]であるべきだと思います。 Plsは私の答えをチェックする。 – Jay

+0

@Jayエラー:行の代入に互換性のない型* aArray [0] - > apple = NULL; –

+0

Try(* aArray)[0] .apple = NULL; – Jay

答えて

1

あなたはそれ以外の場合はあなたに未定義の動作を与えるだけmalloc()またはcalloc()のような従来のメモリ割り当て関数によってあなたに返されたアドレスにrealloc()を呼び出すことができます。

C99標準7.20.3.4-3:realloc関数:

void *realloc(void *ptr, size_t size); 

If ptr is a null pointer, the realloc function behaves like the malloc function for the specified size. Otherwise, if ptr does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to the free or realloc function, the behavior is undefined.

+0

私はすでに* aArray = NULLを設定しています。 しかし、私はaArray [i] - > appleをNULLに設定できません。 –

+0

* malloc **を使用してreallocの代わりにメモリを割り当てる場合は、* aArrayをNULLに設定する必要はありません。 – SirDarius

+0

mallocを使用するように編集しました。それはまだ同じです。 –

1

別にALSは、上記したものから、あなたはまた、として、配列範囲外の読みの問題を抱えていますあなたのループの後では、私の値は100で、aArray[100]にアクセスしようとしていますが、あなたのロジック(間違っていますが)はaArray[99]までしかメモリを割り当てていません。

あなたloadApple機能は以下のように書き換えることができます。

loadApple(AppleArray **aArray) 
{ 
    *aArray = NULL; 
    *aArray = malloc(100 * sizeof(AppleArray)); 

    //I have shown index as 0 here just as an example. 
    (*aArray)[0].apple = NULL;  
    (*aArray)[0].apple = malloc(2 * sizeof(Apple)); 

} 

は、このコードはまた、あなたのコードのロジックを達成しようとしているのと同じ動作を与える必要があります。

+0

@マフムード、私の答えを編集していただきありがとうございます。私はコードなどをマークするオプションを取得していないか、太字などに誰かが私のブラウザ(IE)がそれらを表示していない理由を知っていますか?それ以前は表示されていました。 – Jay

+0

エラー:行の代入に互換性のない型* aArray [0] - > apple = NULL; –

+0

@Jay No prob。私は更新が夜間に頻繁にサイトに転記されることに気付きます。おそらく一時的なバグ - 私はクロムにいる。 –

0
<pre> 
#include "stdio.h" 
#include "stdlib.h" 

#define MAX_SIZE 5 
#define NAME_SIZE 100 
#define APPLE_NUM 2 

typedef struct 
{ 
    int number; 
    char name[NAME_SIZE]; 
}Apple; 

typedef struct 
{ 
    Apple* apple; 
    int bit[2]; 
}AppleArray; 

void printApple(AppleArray** aArray) 
{ 
    int i; 
    for (i = 0; i < MAX_SIZE; ++i) 
    { 
     fprintf(stderr, "%4d: bit[0] = %d, bit[1] = %d\n", i, (*aArray + i)->bit[0], (*aArray + i)->bit[1]); 

     int j; 
     for (j = 0; j < APPLE_NUM; ++j) 
     { 
      fprintf(stderr, "\tapple[%d]: number = %d, name = %s\n", 
        j, 
        (*aArray + i)->apple[j].number, 
        (*aArray + i)->apple[j].name); 
     } 

     printf("\n"); 
    } 
} 

void loadApple(AppleArray **aArray) 
{ 
    *aArray = NULL; 
    int i; 
    for(i = 0; i < MAX_SIZE; i++) 
    { 
     AppleArray* tmp = (AppleArray*)realloc(*aArray, (i+1) * sizeof(AppleArray)); 
     if (tmp != NULL) 
     { 
      *aArray = tmp; 
     } 
     else 
     { 
      //error 
      free(*aArray); 
      *aArray = NULL; 
      exit(0); 
     } 

     /*SEGFAULT here*/ 
     //aArray[i]->apple = NULL; 
     (*aArray + i)->apple = NULL; 
     (*aArray + i)->bit[0] = i; 
     (*aArray + i)->bit[1] = i + 1; 

     /* 
     int j; 
     for (j = 0; j < 2; j++) 
     { 
      (*aArray + i)->apple = realloc(aArray[i]->apple, sizeof(Apple) * (j+1)); 
     } 
     */ 

     (*aArray + i)->apple = (Apple*)realloc(NULL, sizeof(Apple) * APPLE_NUM); 

     int j; 
     for (j = 0; j < APPLE_NUM; ++j) 
     { 
      (*aArray + i)->apple[j].number = j; 
      snprintf((*aArray + i)->apple[j].name, NAME_SIZE, "apple_%d_%d", i, j); 
     } 
    }//for 
} 

void destroyApple(AppleArray* thiz) 
{ 
    if (thiz == NULL) 
    { 
     return; 
    } 

    int i; 
    for (i = 0; i < MAX_SIZE; ++i) 
    { 
     free(thiz[i].apple); 
     thiz[i].apple = NULL; 
    } 

    free(thiz); 
} 

int main() 
{ 
    AppleArray *aArray; 
    loadApple(&aArray); 
    printApple(&aArray); 
    destroyApple(aArray); 

    return 0; 
} 
関連する問題