#include <stdio.h>
void
foo (int (*ptr)[10]) {
(*ptr[0])++;
(*ptr[1])++;
(*ptr[4])++;
}

int
main(int argc, char **argv) {
int i;
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
foo(&arr);
for (i = 0; i < 10; i++) {
    printf ("%d ", arr[i]);
}
printf ("\n");
return 0;
}

Vm@ubuntu:~/src/tcpip_STACK$GCC est.c

Vm@ubuntu:~/src/tcpip_STACK$./a.out

二、二、三、四、五、六、七、八、九、十.

*检测到堆栈粉碎*:已终止

已中止(核心转储)

如何通过foo()中的数组指针访问数组的各个元素? 在这里,在foo()中,基于数组索引,整个数组的 skip 次数与索引值一样多.

推荐答案

您错误地取消了对ptr的引用,因此您将访问不存在的int[10](超出界限).

已更正:

void foo(int (*ptr)[10]) {
    (*ptr)[0]++;
    (*ptr)[1]++;
    (*ptr)[4]++;
}

这与operator precedence一致,该operator precedence表示ptr[0]意味着第一个int[10](这是可以的), ptr[1]表示第二个int[10],ptr[4]表示第五个int[10],然后取消引用并try 增加其中的第一个元素.您必须first取消引用ptr((*ptr)),然后使用下标运算符.

Precedence Operator Description Associativity
1 ++
[]
Post increment
Array subscripting
Left-to-right
2 * Dereference Right-to-left

这意味着您的代码等同于

void foo(int (*ptr)[10]) {
    (*(ptr[0]))++; // increase the first element in the first (only) int[10]
    (*(ptr[1]))++; // undefined behavior
    (*(ptr[4]))++; // undefined behavior
}

C++相关问答推荐

带双指针的2D数组

VS代码C/C++扩展intellisense无法检测环境特定函数'

如何将不同长度的位转换成字节数组?

在C中使用动态内存分配找到最小的负数

将 typewriter LF打印到Windows终端,而不是隐含的CR+LF

如何在C中通过套接字自定义数据类型读取原始变量?

struct 上的OpenMP缩减

如何在C中使printf不刷新标准输出?

获取每个循环迭代结束时的当前时间

防止C++中递归函数使用堆栈内存

等同于铁 rust 的纯C语言S未实现!()宏

使用TCL C API导航到列表中的元素

错误:字符串在C中获得意外输出

向左移位3如何得到以字节为单位的位数?

共享目标代码似乎不能在Linux上的进程之间共享

Matlab/Octave对conv2函数使用哪种方法?

保存有符号整数结果的变量是否会溢出(后增量的副作用),并且此后从未在任何表达式中使用过它,是否会导致 UB?

为什么创建局部变量的指针需要过程在堆栈上分配空间?

可以从指针数组中的值初始化指针吗?

文件指针引起的C程序分段错误