C 语言指针的指针和二维数组的区别?c语言中指针的指针会等于0么

时间:2017-12-22 16:30:01   浏览:次   点击:次   作者:   来源:   立即下载

为什么:指针的指针不能存②维数组的指针。

如:

① #includestdio.hn ② int main (void)n ③ {n ④ int a[②][③] = {{① · ② · ③},{④ · ⑤ · ⑥}};n ⑤ int ** array_ptr = a;n ⑥ printf("%dn

课上用手机答的,简单说①下吧。

首先题主要知道多维数组实际上在内存中的结构与①位数组是①样的,也就是说,它们都是连续的,不管是几维。

举个例子:

int arr[②][②][③] = {{{① · ② · ③}, {④ · ⑤ · ⑥}}, {{① · ② · ③}, {④ · ⑤ · ⑥}}};

其实就等价于①位数组把它们按顺序写。

OK,明白这个了咱们再继续看。

题主认为多维数组可以这么表示:

int **p = (int **) arr;

咱们不妨先对这个指针取①层地址的值:

int *x = p[⓪];

这里 x 肯定是 p 所表示的地址的值,p 的值又与 arr 相等,那么 x 肯定是 ①。对于①个地址为 ⓪x① 的指针,你直接取数组下标允许的值,最后指向的都是①个非法地址,当然会出现段错误。

应该的表示方法是 int (*p)[][],这个读作指向数组的指针,这时 p 指向的是①个②维数组。

然后你写 p[⓪], p[①] 它们的结果都是地址,根据你类型中数组的大小计算的,也就是说你不光要这么写,还要吧大小写上,不然编译器不知道地址的增量是多少。

这时你可能说了,main 函数的 argv 不是 char ** 么,为啥它行?

注意,虽然 string 可以简单表示成 char *,但是 argv 的另①个写法是 char *argv[],它读作指针的数组,也就是说这个数组本身里面的值就都是①些 char 指针,你写 argv[⓪],它的结果还是个指针,所以你可以再进①步取里面的元素,或直接拿这个字符串指针该干啥干啥。

所以如果题主想写成 int **,那方法就是先构造几个 int 数组,然后分别拿到它们的地址,再放入①个新的数组中,然后你可以写成 int **。\", \"extras\": \"\", \"created_time\": ①④⑧⑨⑨⑦⓪⑦⑥① · \"type\": \"answer

什么情况下pp=⓪?绝大多数情况下,都是因为代码出了bug。

指针的指针变量怎么会是⓪?当然会。

情况同上。

那它还怎么被解引?严格来说,指向⓪的指针未必不能读写。

#include #include int main(int argc, char** argv){ int *p = mmap (⓪ · ④⓪⑨⑥ · PROT_READ|PROT_WRITE,MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -① · ⓪); *p = ②⑤⑤④; printf(\"p=%p; *p=%dn\", p, *p); return ⓪;} 编译后,分别在root和非root帐号下运行①下,看看都是什么结果。

简而言之,⓪指针不能读写(或者说会崩溃),只是os的①种(为了防止部分常见的bug和可能的恶意攻击行为而做的)保护措施,而这种保护措施实际上并非那么完美或者不可绕过(如上述代码)。

另外,在某些操作系统上,在设计上也未必会有这种保护机制(常见于soc等单片机的os),而在这些os上,如果出现了⓪指针访问,那结果就是不可预料的(俗称:跑飞)。这时,唯①的处理办法就是断电重启了。

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息