在不同函数的动态分配整数阵列上的segfault

发布于 2025-01-24 04:49:38 字数 472 浏览 3 评论 0原文

#include <stdio.h>
#include <stdlib.h>

void a(int** parr) {
    *parr = malloc(sizeof(int) * 5);
}

void b(int** parr) {
  *parr[0] = 100;
  *parr[1] = 200;
}

int main(void) {
  int* parr;
  a(&parr);
  parr[0] = 50;
  parr[1] = 75;
  b(&parr);
  printf("%d %d\n", parr[0], parr[1]);
  return 0;
}

由于某种原因,此segfault在上*Parr [1] = 200,我不知道原因。我将数组的整数指针传递到b()*parr [0] = 100按预期工作。

#include <stdio.h>
#include <stdlib.h>

void a(int** parr) {
    *parr = malloc(sizeof(int) * 5);
}

void b(int** parr) {
  *parr[0] = 100;
  *parr[1] = 200;
}

int main(void) {
  int* parr;
  a(&parr);
  parr[0] = 50;
  parr[1] = 75;
  b(&parr);
  printf("%d %d\n", parr[0], parr[1]);
  return 0;
}

For some reason, this segfaults on *parr[1] = 200 and I can't figure out why. I'm passing in an integer pointer to the array into b(), and *parr[0] = 100 works as intended.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

魂归处 2025-01-31 04:49:38

[]操作员的优先级高于Dereference *运算符。因此,这两行代码需要参与括号的服务以获取所需的操作顺序:

(*parr)[0] = 100;
(*parr)[1] = 200;

此外,实际上没有理由b函数进行双重指针,因为它不会改变原始parr指针(与A函数相比)。因此,代码可能更简单而更少的错误写为:

void b(int* parr) {
  parr[0] = 100;
  parr[1] = 200;
}

并与:

b(parr);

The [] operator has higher precedence than the dereference * operator. So those two lines of code need to engage the services of parenthesis to get the desired order of operations:

(*parr)[0] = 100;
(*parr)[1] = 200;

Also, there is really no reason for the b function to take a double pointer as it does not change the original parr pointer (compared to a function which does). So the code could be more simply and less error pronely written as:

void b(int* parr) {
  parr[0] = 100;
  parr[1] = 200;
}

And called with:

b(parr);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文