对C中的增量运算符感到困惑

Confused about increment operator in C

我用 C 语言编写了一个程序来使用数组创建基本堆栈。它按预期工作,但有些事情我很困惑。在 push 方法的第一行,我增加了 *top_ptr 的值,这是一个指向变量 top 的指针,使用语法 *top_ptr = *top_ptr+1。当我尝试用 *top_ptr++ 替换这一行时,我认为它更简洁并且意思相同,我收到一条警告,指出 Wunused 变量,并且在 运行 宁它时出现分段错误。来自我的终端的警告信息逐字逐句地是

warning: expression result unused [-Wunused-value]
*top_ptr++;
^~~~~~~~~~

我从终端收到的确切错误消息是:

zsh: segmentation fault  ./stacks/arrayi

当我运行程序与当前程序时,我的输出是我期望的:1 2 3 %

我的代码如下。再一次,我感到困惑的是 push 方法的第一行,即第 17 行。如果您回答了这个问题,那么感谢您的时间和考虑。

#include <stdio.h>
#define MAX_SIZE 101

void push(int *, int *, int);
void print(int *, int *);
int main() {
  int top = -1;
  int *top_ptr = &top;
  int arr[MAX_SIZE];
  push(arr, top_ptr, 1);
  push(arr, top_ptr, 2);
  push(arr, top_ptr, 3);
  print(arr, top_ptr);
}

void push(int *array, int *top_ptr, int x) {
  *top_ptr = *top_ptr + 1;
  array[*top_ptr] = x;
}

void print(int *array, int *top_ptr) {
  for (int i = 0; i <= *top_ptr; i++) {
    printf("%d ", array[i]);
  }
}

*top_ptr++*(top_ptr++),这是错误的,因为它改变了top_ptr,这不是你想要做的。

你想要(*top_ptr)++.

编译器警告您表达式结果未使用,因为在 (top_ptr++) 之后,* 获取 (top_ptr++) 指向的值,但没有对该值执行任何操作。这是可疑的,因此编译器会警告您,您已告诉它获取一个值但不对其执行任何操作。

相比之下,使用 (*top_ptr)++,它不会警告您,因为 ++ 修改了 (*top_ptr) 指向的内容,因此表达式以有用的操作结束。

你应该做的

(*top_ptr)++;

那个括号很重要。如果你不给括号那么基本上它会像

一样执行
*(top_ptr++);

即首先指针 top_ptr 将递增,然后它会被推迟。这就是为什么它给你分段错误。
(并且top_ptr指向的值不会递增)