2

私は理にかなっていますか?これは私がやろうとしていることです:

unsigned int *a = 0;
unsigned int **b = &a;
// b -> a -> null

*b = (unsigned int*)malloc(12);
// b -> a -> [xxxx|xxxx|xxxx]

*(*b+1) = (unsigned int)malloc(sizeof("come on!"));
// b -> a -> [xxxx|xxxx|xxxx]
//                 v
//                [xxxxxxxxx]

strcpy((char*)*(*b+1),"come on!");  // FAILS! why?

他に何を説明できるかわかりません。

4

2 に答える 2

1

32ビット環境で問題なく動作します。ただし、@Blagovest Buyuklievは、ポインターのサイズについて仮定をすべきではないという点で正しいです(たとえそれが機能しているように見えても)。これらのunsigned intをchar * ´ 用に変更したほうがよいでしょう。以下のわずかに変更されたバージョンを参照してください。

char* *a = 0;
char* **b = &a;
// b -> a -> null

*b = malloc(12);
// b -> a -> [xxxx|xxxx|xxxx]

*((*b)+1) = malloc(sizeof("come on!"));
// b -> a -> [xxxx|xxxx|xxxx]
//                 v
//                [xxxxxxxxx]

strcpy(*((*b)+1),"come on!");  // FAILS! why?

printf("%s", a[1]);

とはいえ、それは機能し、ポインタとメモリについて学ぶ良い方法かもしれませんが、言語の使用法を確認する必要があります. 文字列を表示するためにprintf()
を追加しました。

于 2012-11-08T19:46:02.100 に答える
0

このプログラムの本当の意図はわかりませんが、視覚化を考えると、あなたは間違っていると思います。次のように書き直します。

// why do you need a at all? b can be initialised to NULL without a second variable
// unsigned int *a = NULL;
unsigned int **b = NULL;

// you are allocating 3 pointers here
b = malloc(sizeof(unsigned int *) * 3);
// b -> [xxxx|xxxx|xxxx]

// the second pointer is made to point to newly allocated memory
*(b + 1) = malloc(sizeof("come on!"));
// b -> [xxxx|xxxx|xxxx]
//            v
//           [xxxxxxxxx]

strcpy((char *) *(b + 1), "come on!");

sizeof(unsigned int *)また、ハードコードされた信頼性の低い仮定に頼るのではなく、ポインターのサイズを決定するために を使用することにも注意してください。

于 2012-11-08T19:52:25.753 に答える