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 *´s。请参见下面稍作修改的版本:

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 回答