【问题标题】:Iterating over an array that has been passed by reference in c遍历在 c 中通过引用传递的数组
【发布时间】:2013-04-06 03:24:27
【问题描述】:

我想用c写一个打印数组函数。当您通过引用将数组传递给 c 函数时,我有一个群体,它传递了一个指向第一个元素的指针。我假设我可以增加这个指针来迭代数组但是我的程序只是段错误。

我想首先知道为什么我的程序会出现段错误,以及在 c 中编写这样的函数最惯用的方法是什么。非常感谢。

void print_array(int *array, int length) {
    int i = 0; 
    for (i = 0; i < length; array++) {
        printf("%d\n", *array);
    }
}

int main (int argc, int *argv[]) {
    int test[10] = {0};
    print_array(test, 10);
}

【问题讨论】:

  • 你永远不会增加i
  • 你将指针递增到遗忘
  • -1 用于更改参数的值。在不那么琐碎的代码中,它很难理解。

标签: c arrays function pointers


【解决方案1】:

您的循环是无限的,因为i &lt; length 中的i 永远不会改变;该条件始终评估为真。结果,您跳过了循环的末尾。我建议将您的循环更改为:

for (i = 0; i < length; i++) {
    printf("%d\n", array[i]);
}

...或者,如果您想使用array++,请更改条件:

for (int *end = array + length; array < end; array++) {
    printf("%d\n", *array);
}

【讨论】:

  • 有趣。所以 *end 是数组指针 + 长度。我是否正确假设当您将 int 添加到指针时,它会返回添加的 int 的指针偏移量。那么鉴于array++指向下一个内存块?
  • @Stewart s/指向下一个内存块/导致数组指向下一个 int/。 array + 1 指向array[1]array++array = array + 1 的简写。
【解决方案2】:

试试这个:

void print_array(int *array, int length) {
    int i = 0; 
    for (i = 0; i < length; i++) {
        printf("%d\n", array[i]);
    }
}

由于i 是您的循环控制变量(它处于循环条件中),您需要增加它以避免无限循环。使用[] 表示法对于您级别的人来说比尝试手动增加指针更容易掌握。

【讨论】:

    猜你喜欢
    • 2017-04-19
    • 2017-01-17
    • 2013-11-07
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 2012-04-17
    相关资源
    最近更新 更多