繁体   English   中英

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

[英]Confused about increment operator in C

我已经用 C 编写了一个程序来使用数组创建一个基本堆栈。 它按预期工作,但有一些我很困惑。 在 push 方法的第一行,我使用语法*top_ptr = *top_ptr+1递增 *top_ptr 的值,它是一个指向变量 top 的指针。 当我尝试用*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 指向的值不会增加)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM