7

次のコードは、セグメンテーション違反を示します。理由がわかりません。参照してください..

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

int main()
{
    int **ptr;
    int *val;
    int x = 7;
    val = &x;
    *ptr = (int *)malloc(10 * sizeof (*val));
    *ptr[0] = *val;
    printf("%d\n", *ptr[0] );

    return 0;
}

gdbを使用したデバッグでは、次のようになります。

Program received signal SIGSEGV, Segmentation fault.

0x0804843f in main () at temp.c:10

*ptr = (int *)malloc(10 * sizeof (*val));

問題に関する助けをいただければ幸いです。

4

5 に答える 5

12
int **ptr; 
*ptr = (int *)malloc(10 * sizeof (*val));

最初のステートメントはダブルポインタを宣言します。
2番目はポインタを逆参照します。逆参照できるようにするには、ポインタが有効なメモリを指している必要があります。したがって、セグメンテーション違反は発生しません。

ポインタの配列に十分なメモリを割り当てる必要がある場合は、次のものが必要です。

ptr = malloc(sizeof(int *) * 10); 

ここで、へのポインタをptr保持するのに十分な大きさのメモリを指します。それ自体がポインタである各配列要素は、 where を使用してアクセスできるようになりました。10int
ptr[i]

i < 10
于 2012-09-25T09:17:30.490 に答える
4
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int **ptr;
    int x;

    x = 5;

    ptr = malloc(sizeof(int *) * 10);
    ptr[0] = &x;
    /* etc */

    printf("%d\n", *ptr[0]);

    free(ptr);
    return 0;
}
于 2012-09-25T09:19:22.793 に答える
3

以下のプログラムを参照してください。おそらく、理解を深めるのに役立ちます。

#include<stdio.h>
#include <stdlib.h>
int main(){

/* Single Dimention */

int *sdimen,i;
sdimen = malloc ( 10 * sizeof (int));
/* Access elements like single diminution. */
sdimen[0] = 10;
sdimen[1] = 20;

printf ("\n.. %d... %d ", sdimen[0], sdimen[1]);

/* Two dimention ie: **Array of pointers.**  */

int **twodimen;

twodimen = malloc ( sizeof ( int *) * 10);

for (i=0; i<10; i++) {
  twodimen[i] = malloc (sizeof(int) * 5);

}

/* Access array of pointers */

twodimen[0][0] = 10;
twodimen[0][3] = 30;
twodimen[2][3] = 50;

printf ("\n %d ... %d.... %d ", twodimen[0][0], twodimen[0][3], twodimen[2][3]);
return 0;
}

お役に立てれば.. ;)。

于 2012-09-25T09:34:18.990 に答える
0

概念的には、** ptrを使用している場合は、ptrおよび*ptrのメモリを**ptrの防御に割り当てる必要があります。

しかし、あなたの場合、* ptrに対してのみメモリを割り当てています。コンパイラが、ptr(1つのポインタ位置)が* ptrをリンクするのに十分スマートである場合、ptr-> ptr-> *ptr.Henceをリンクできます。セグメンテーション違反は発生していません。

于 2013-03-20T07:58:01.850 に答える
0

含む

含む

int main()    
{    
    int **ptr;    
    int *val;    
    int x = 7;    
    val = &x;    
    ptr = (int**)malloc(sizeof(int**));    
    *ptr = (int *)malloc(10 * sizeof (*val));    
    *ptr[0] = *val;    
    printf("%d\n", *ptr[0] );    
    return 0;    
}

上記はうまくいくでしょう。違いを見つけて、その理由も理解できます。

結論として、メモリを割り当てずに**ptrを参照解除していました。

于 2017-06-20T11:19:16.413 に答える