【问题标题】:C how to iterate through function int array of unknown size as argumentC如何迭代未知大小的函数int数组作为参数
【发布时间】:2021-05-12 10:18:13
【问题描述】:

我有以下代码:

intlist* create_list(int *arr) {

    intlist* l = malloc(sizeof(intlist));

    while(*arr++) {
        l->sum += *arr; 
        //*arr++;
    }

    return l;
}

void printl(intlist* l) {
    printf("%d\n", l->sum);
}

当我在 while 循环内打印 *arr 时,它会显示正确的值。问题是在我退出函数 create_list 并尝试访问列表的总和后,这是完全错误的。例如,它不是 1 + 2 + 3 = 6,而是类似于 -123871239012。我做错了什么?

我不是在寻找将数组大小传递给的函数,因为根据我的观点和经验,在大多数情况下使用这种方法非常危险。我不想传递数组的大小,因为如果我不小心写了“1239123”而不是“1239122”,我可能会做坏事。或者更糟糕的是,如果我在最后一个地方没有按“3”时,不小心写了“1239123”而不是“123912”,那将会产生毁灭性的影响。

【问题讨论】:

  • 我现在注意到,当我到达数组末尾时,while 循环并没有结束,而是实际上继续了几个循环。我该如何解决这个问题?
  • 发布一个完整的程序,而不仅仅是它的片段。
  • 这能回答你的问题吗? Passing Array Size along with pointer in c

标签: arrays c pointers while-loop function-definition


【解决方案1】:

函数create_list有两个问题

intlist* create_list(int *arr) {

    intlist* l = malloc(sizeof(intlist));

    while(*arr++) {
        l->sum += *arr; 
        //*arr++;
    }

    return l;
}

第一个是数据成员sum没有初始化。

第二个是因为while循环的条件后自增而忽略了数组的第一个元素

    while(*arr++) {

你至少应该写

    while(*arr) {
        l->sum += *arr; 
        arr++;
    }

请注意,在将控件传递给while循环之前,您应该检查是否为intlist类型的对象成功分配了内存。

该函数期望数组包含一个标记值等于 0 的元素。

如果函数必须处理不具有标记值元素的数组,那么您必须声明第二个参数,该参数将指定传递的数组中有多少元素。

注意第一个参数应该有限定符const,因为传递的数组在函数内没有被改变。

就是函数应该这样声明

intlist * create_list( const int *arr, size_t n );

【讨论】:

    【解决方案2】:

    一些错误:

    while(*arr++) {
        l->sum += *arr; 
        //*arr++;
    }
    

    您将在 arr 增量之后添加*arr

    为了说明这个问题:https://godbolt.org/z/5qe9cE

    必须是:

    while(*arr) {
        l->sum += *arr++; 
        //*arr++;
    }
    

    分配的内存未初始化,结构成员具有未确定的值(可以是任何值)。在循环之前你需要

        l->sum = 0; 
    

    例如,数组必须以0 终止

    int array[] = {1,2,3,4,5,6,0};
    

    https://godbolt.org/z/c8cPGs

    【讨论】:

    • 我可以用非整数数据终止吗?我可能在其中一个数字数组中有一个 0,或者基本上我的列表中的任何整数都是可能的。我尝试添加NAN,并尝试在末尾添加\0,但没有成功。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    相关资源
    最近更新 更多