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

typedef struct s{
    int n;
}F;

F* make();
void create(F *s);
void add(F *f);
void show(F *f);

int main()
{
    F *f=NULL;

    //1.) the following doesn't work
    create(f);
    show(f);


    //2.) The Following is work
    f=make();
    show(f);



    printf("Hello world!\n");
    return 0;
}

void add(F *f){
    (f->n)++;
}
void show(F *f){
    printf("\n======\n %d \n======\n",f->n);
}
F* make(){
    F * temp=(F*)malloc(sizeof(F));
    temp->n=19;
    return temp;
}
void create(F *s){
    F * temp=(F*)malloc(sizeof(F));
    temp=make();
    s=temp;
    show(s);
    }

なぜコード fragment(1) が断片化違反と言うのか説明してください (無効なメモリ空間へのアクセスに関することはわかっていますが、自分のコードを見るとどこが間違っているのかわかりません。) が、(2)大丈夫です、うまくいきます。前もって感謝します 。

4

3 に答える 3

1

seg fault が発生する理由は、変数finmainが残っているためNULLです。

これは、関数の外部とは関係のないローカル変数へのcreate()割り当てにあるためです。関数でポインターが指す場所を変更する場合は、ポインターをポインターに渡す必要があります。.tempsfF **s

関数create()は次のようになります。

void create(F **s){
    F * temp=(F*)malloc(sizeof(F));
    temp=make();
    *s=temp;
    show(*s);
}

fそしてtoのアドレスを渡しますcreate():

create(&f);

sには のアドレスが含まれているfため、 の値*sを変更することは の値を変更することと同じですf

于 2012-09-26T10:59:34.923 に答える
0

create()次のように、ポインターへのポインターを受け入れるように変更する必要がありますF

void create(F** s)
{
    F* temp = malloc(sizeof(F));
    *s = temp;
    show(*s);
}
于 2012-09-26T10:57:42.230 に答える
0
 F *f=NULL;      //1.) the following doesn't work     
 create(f); 

ポインターを値渡しで関数に渡します。元のポインタfにメモリが割り当てられることはありません。この関数は、ポインタのコピーにメモリを割り当てますf。一方、fまだ を指していNULLます。最終的に、NULLポインターを逆参照することになり、未定義の動作が発生し、セグメンテーション違反の形で現れます。

メモリを割り当てるには、関数への参照によってポインターを渡す必要があります。

 create(&f); 

どこ:

void create(F **s);

void create(F **s)
{
    *s = malloc(sizeof(F));     
    show(*s); 
}
于 2012-09-26T10:57:48.850 に答える