-4

整数ポインターを使用して、一度に 4 バイトを文字バッファーに書き込もうとしています (一度に 4 つのメモリ位置にアクセスできるようにするため)。しかし、セグメンテーション違反が発生しています。

#include<stdio.h>
void main()
{
unsigned char ssdData[2][10];
unsigned int** cur_ptr;

printf("1\n");
cur_ptr=ssdData;
printf("2\n");
**cur_ptr=(unsigned int)5;
printf("3\n");
printf("cur_ptr=%d",cur_ptr[0][0]);
}

どこが間違っていますか?

4

3 に答える 3

2

変化する

 unsigned int** cur_ptr;
 **cur_ptr=(unsigned int)5;
 printf("cur_ptr=%d",cur_ptr[0][0]);

 unsigned int * cur_ptr;
 *cur_ptr=(unsigned int)5;
 printf("cur_ptr=%d",cur_ptr[0]); //or printf("cur_ptr=%d", *cur_ptr);

cur_ptrダブル ポインターの代わりにシングル ポインターを使用します。cur_ptr整数へのポインターの配列/ポインターではなく、整数を指す必要があります。

于 2013-07-27T05:38:53.787 に答える
2

あなたが間違っているのは、配列がポインターであり、2D 配列が二重ポインターであると考えていることです。それは間違っています。これを読んでください。

2 次元配列の最初の要素にアクセスする場合は、次を使用します。

arr[0][0] = 5;

または同等のもの

**arr = 5;

arr配列はどこにありますか。ポインターの場合は、次のように宣言して使用する必要があります。

int (*ptr)[10] = &arr[0];
(*ptr)[0] = 5;
// or:
**ptr = 5;

またはこのように:

int *ptr = arr[0];
ptr[0] = 5;
// or:
*ptr = 5;
于 2013-07-27T05:44:13.823 に答える
1

cur_ptrへのポインタへのポインタとして宣言しますunsigned int。次に、式で のアドレスに減衰するcur_ptr配列に初期化します。したがって、あなたの記憶は次のようになります。ssdDatassData

cur_ptr--> | ssdData[0][0] | ssdData[0][1] | . . . | ssData[1][9] |

に割り当てる**cur_ptrと、 が指すメモリ位置が指すメモリ位置に割り当てられますcur_ptr。したがって、コンテンツの最初の部分をssDataアドレスとして読み取り、その場所に割り当てようとします。この時点でのコンテンツの最初の部分は、ssData初期化されていないガベージです。したがって、セグメンテーション違反を引き起こしているランダムなメモリ位置に書き込もうとしています。

于 2013-07-27T06:02:25.260 に答える