【问题标题】:C array pointer in function [duplicate]函数中的C数组指针[重复]
【发布时间】:2021-12-27 22:14:23
【问题描述】:

我写了这个函数:

int einmaleins(int zahl, int *arr){
int e;
for(int i = 1; i<11; i++){
    e = zahl*i;
    arr[i-1]=e;
}

return 0;
}

int main(){
int arr[10] = {0};
einmaleins(2, &arr[10]);

return 0;
}

问题是指针数组,但是当我启动程序时,我收到以下消息:***检测到堆栈粉碎***:终止

我真的不知道该怎么办。

【问题讨论】:

  • &amp;arr[10] - 这是指向数组第十一个元素的指针。其中只有十个元素...
  • @EugeneSh。对,奇怪的代码,我需要咖啡
  • 您使用 IDE 吗?如果没有,我建议你买一个。然后了解调试器。您可以在代码中设置“断点”(或多个)并运行代码。当它到达断点时,它将停止,您可以检查变量,然后逐行单步执行您的代码,观察变量。这通常是查找此类问题的最快方法。

标签: arrays c pointers implicit-conversion function-call


【解决方案1】:

在本次通话中

einmaleins(2, &arr[10]);

您将内存地址传递给数组的最后一个元素。

像这样调用函数

einmaleins(2, arr);

在调用中用作参数表达式的数组指示符被隐式转换为指向其第一个元素的指针,

其实调用就等价于

einmaleins(2, &arr[0]);

【讨论】:

    【解决方案2】:

    排队

    einmaleins(2, &amp;arr[10]);

    表达式&amp;arr[10] 会将第11 个 元素的地址(在C 中,索引从0 开始)传递给函数einmaleins。这可能不是您想要的,因为这会导致函数einmaleins 越界访问数组。

    你可能想传递第一个元素的地址,所以你可以写成&amp;arr[0]。但是,简单地写arr是正常的。当你这样做时,数组会自动decay指向第一个元素的指针,这样就相当于写&amp;arr[0]

    【讨论】:

      猜你喜欢
      • 2013-02-19
      • 2011-02-14
      • 1970-01-01
      • 2021-11-08
      • 2018-08-24
      • 2023-03-31
      • 2013-07-14
      • 2014-11-26
      • 1970-01-01
      相关资源
      最近更新 更多