-6

2 つのポインターと int 変数を持つ構造体があります。何らかの理由で、行でセグメンテーション違反が発生していますptr->i=0;。何故ですか?私はメモリ内の何かを指していiますが、それはポインタではないので、合法でなければなりません。誰でもこれで何が起こっているのか説明できますか? 構造体と 2 つの char ポインター用のメモリを作成しました。

struct A_ {
char *a;
char *b;
int i;
};

typdef struct A_ StructA;

そして、私のmain()中には次のものがあります:

StructA *ptr=malloc(sizeof(StructA));
ptr->a=malloc(sizeof(char));
ptr->b=malloc(sizeof(char));

ptr->i=0;
4

3 に答える 3

3

初期化されていないため、メモリ内の何も指してptrいません。

編集:コードの他の場所で何か間違ったことをしています。以下はコンパイルされ、完了するまで実行されます。コードは次のものからモデル化する必要があります。

#include <stdio.h>

typedef struct A {
    int i;
} A;

int main(void) {
    A *a = malloc(sizeof(A));
    a->i = 42;
    printf("%d", a->i);
    free(a);
    return 0;
}

さらに重要なこととして、時間をかけて C やメモリ管理について読み、好みのデバッガーに投資することをお勧めします。

于 2013-09-17T20:18:51.237 に答える
1

あなたが提供した部品は、もう少し作業を加えるだけでうまく収まります。

#include <stdlib.h> /* stdlib.h contains declaration for malloc */

struct A_ {
    char *a;
    char *b;
    int i;
};

typedef struct A_ StructA; /* fixed a typo */

int main(void)
{
    StructA *ptr = malloc(sizeof(StructA));
    ptr->a = malloc(sizeof(char));
    ptr->b = malloc(sizeof(char));

    ptr->i = 0;

    return 0;
}

プログラムのどこかにエラーがある可能性があります。行の前の ptr に別の値を割り当てましたptr->i = 0;か?

于 2013-09-17T20:48:37.090 に答える
1

構造体自体ではなく、構造体へのポインターを作成しており、初期化されていないポインターのメンバーにアクセスしています。どうしても構造体へのポインターを使用する場合は、まずそれが指す実際の構造体を作成する必要があります。

これを行う:

StructA myStruct;
StructA* ptr = &myStruct;
ptr->i=0;

すべて修正。

編集:


あなたは、静的に割り当てられたメモリ (上記の私の例) と動的に割り当てられたメモリ (つまり、malloc、calloc などを使用) に慣れていないようです。

別の方法は次のとおりです。

StructA* ptr = malloc(sizeof(StructA));
if (ptr == NULL) {
    printf("Memory allocation error!\n");
} else {
    /* Malloc succeeded */
    ptr->i=0;
}

詳細については、この投稿を参照してください。

宣言された文字列と割り当てられた文字列の違い

于 2013-09-17T20:19:30.567 に答える