0

さて、私が見逃している簡単な修正があると確信していますが、現在、私のコードは「A [i]-> key=0;」という行でセグメンテーション違反を引き起こしています。Record * Item部分はプログラムに必要なので、作業中の割り当てではこのように機能させる必要がありますが、ItemがRecordの非ポインターtypedefになるように変更すると、I A[i].keyを問題なく使用できます。StandInputがレコードへのポインターの配列に値を正しく割り当てることができるように、正しい方向に微調整する必要があります。ありがとう!

Item.h:

#include "stdio.h"
#include "stdlib.h"

typedef int keyType;

struct Record
{
    keyType key;
    int other;
};
typedef struct Record* Item;

void standInput(Item *A, int n)
{
    int i, input;
    for(i = 0; i <= n-1; i++)
    {
        A[i]->key = 0;
        printf("%d ", A[i]->key);
    }
}

主要:

#include "stdio.h"
#include "stdlib.h"
#include "Item.h"

int main()
{
    int n;
    Item *A;
    printf("Enter a length for the array: ");
    scanf("%d", &n);
    A = (Item*)malloc(n * sizeof(Item));
    standInput(A, n);
    return 0;
}
4

4 に答える 4

2

Itemすでにポインターであることに注意してください。

ポインターではなく、構造体にスペースを割り当てる必要があります。

A = (Item)malloc(n * sizeof(struct Record));

注: ポインターの typedef が混乱する場合は、使用しないでください ;)

A[i]->keyA[i]はポインタであることを意味しますが、配列を割り当てただけなので、 を使用しますA[i].key

注: それに応じて A のタイプを変更する必要があります。

2番目の解決策: A[i] をポインターにしたい場合は、最初にポインターにスペースを割り当て (現在のように)、次に各ポインターに (ループ内で) 構造体にスペースを割り当てる必要があります。

于 2012-04-22T22:30:18.793 に答える
2

の値Aはすべて初期化されていませんが、struct Recordとにかくポインターとして使用しています。A(構造体を直接ではなく) ポインターを保持し続けたい場合は、が指す各アイテムにスペースA A割り当てる必要があります。

于 2012-04-22T22:32:19.327 に答える
0

あなたの構造名は ではありRecordませんItem。したがって、使用する必要がありますsizeof(struct Record)

于 2012-04-22T22:32:10.253 に答える
0

このようにしてください:

int main()
{
    int n, i;
    Item *A;
    printf("Enter a length for the array: ");
    scanf("%d", &n);
    A = (Item*)malloc(n * sizeof(Item));
    for(i=0; i<n; i++){
        A[i] = (Item)malloc(sizeof(struct Record));
    }
    standInput(A, n);
    return 0;
}
于 2012-04-22T23:00:29.217 に答える