我有一个以上的疑问所以请耐心等待.有人能告诉我为什么这段代码失败了吗?
#include<stdio.h>
void main(int argc,char **argv) /*assume program called with arguments aaa bbb ccc*/
{
char **list={"aaa","bbb","ccc"};
printf("%s",argv[1]);/*prints aaa*/
printf("%s",list[1]); /*fails*/
}
Run Code Online (Sandbox Code Playgroud)
我认为它与指针内容的指针有关,我不明白.所以我试过:
#include<stdio.h>
void main()
{
char **list={"aaa","bbb","ccc"};
char *ptr;
ptr=list;
printf("%s",ptr);/*this prints the first string aaa*/
/* My second question is how do i increment the value
of ptr so that it points to the second string bbb*/
}
Run Code Online (Sandbox Code Playgroud)
是什么区别char *list[]和char **list在什么场合都可以使用这两个理想是什么?令我困惑的另一件事是argv特别?当我传递char **list给另一个函数,假设它让我以我能用的方式访问内容时argv,它也失败了.
我意识到过去曾经问过类似的问题,但我似乎无法找到我需要的东西.若有,有人可以发布相关链接.
Mik*_*one 12
你应该使用char *list[]={"aaa","bbb","ccc"};而不是char **list={"aaa","bbb","ccc"};.您char* list[] = {...};用来声明指针数组,但是char**用于将指针传递给指向函数的一个或多个指针.
T* x[] =指针数组T** x =指针指针PS响应ejohn:我只能想到一个用于创建指针的指针(作为实际声明的变量,而不是函数参数或由一元运算&符创建的临时变量):一个句柄.简而言之,句柄是指向指针的指针,其中句柄e由用户拥有,但它指向的指针可以根据操作系统或库的需要进行更改.
在旧的Mac OS中广泛使用句柄.由于Mac OS是在没有虚拟内存技术的情况下开发的,因此保持堆快速碎片化的唯一方法是在几乎所有内存分配中使用句柄.这让操作系统根据需要移动内存来压缩堆并打开更大,连续的可用内存块.
事实上,这种策略充其量只是"少吸".有一大堆缺点:
memcpy()工作).我忘记了可能还有几个.请记住,所有这些缺点仍然比仅使用指针和快速分割堆更加可口,特别是在第一台只有128K RAM的Mac上.这也让我们深入了解了为什么Apple非常乐意放弃所有这些并转向BSD然后他们有机会,一旦他们的整个产品线都有内存管理单元.