C语言 以下哪项操作会导致非法内存访问

nbysray5  于 2023-01-08  发布在  其他
关注(0)|答案(1)|浏览(122)

考虑下面的C代码声明。

int (*p)[10];

如果变量没有初始化到任何地址,那么以下哪一项可能会产生运行时错误?
1.第一个月

  1. (p+1)[2]
  2. p[2]
  3. *p[2]
    我的答案是:2,3,4。
    由于p没有初始化,它可以包含任何垃圾值,因此*(p+3)*(p+2)**(p+2)可能导致非法内存访问。
    给出的答案:4.
    他们的解释是:如果我们试图访问一些无效的内存,我们会得到一个运行时错误(分段错误)。是一个指向大小为的整数数组的指针。它的声明有一个 *(星号)和一个[](方括号)。如果我们想使用来访问内存,那么我们必须使用两个 *(星号)或者一个 *(星号)和一个[](方括号)或者两个[](方括号)。
    以下用法可能会产生运行时错误-
**p
*p[]
p[][]

2和3是否会导致非法内存访问?

wwwo4jvm

wwwo4jvm1#

一般来说没有或者全部都有。一切都取决于你如何使用它。
示例:
1.如果在sizeof中使用它是安全的

printf("%zu\n",sizeof((p+1)));
    printf("%zu\n",sizeof(((p+1)[2])));
    printf("%zu\n",sizeof((p[2])));
    printf("%zu\n",sizeof((*p[2])));

2.其中任何一个都可能导致未定义的行为(可以表现为内存故障)

p = (p+1);  //UB is p is dereferenced
    int *x = (p+1)[2]; //x has undermined value
    int *y = p[2];     //same as above
    *p[2] = 5;         //p was not initialized

相关问题