Arrays C如何遍历未知大小的函数int数组作为参数

Arrays C如何遍历未知大小的函数int数组作为参数,arrays,c,pointers,while-loop,function-definition,Arrays,C,Pointers,While Loop,Function Definition,我有以下代码: 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); } 当我在wh

我有以下代码:

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时,它会显示正确的值。问题是在我退出函数,创建_列表,并尝试访问列表的总和之后,它是完全错误的。例如,它不是1+2+3=6,而是类似于-123871239012。我做错了什么

我并不是在寻找一个传递数组大小的函数,因为在我看来和我的经验中,在大多数情况下,这是一种非常危险的方法。我不想传递数组的大小,因为如果我不小心写了1239123而不是1239122,我可能会做一些不好的事情。或者更糟糕的是,如果我继续写1239123而不是123912,在最后一个位置我没有按3,它将产生毁灭性的影响。

一些错误:

while(*arr++) {
    l->sum += *arr; 
    //*arr++;
}
您将在arr增量之后添加*arr

为了说明这个问题:

它必须是:

while(*arr) {
    l->sum += *arr++; 
    //*arr++;
}
malloced内存未初始化,并且结构成员具有未确定的值—它可以是任何内容。在循环之前,您需要

    l->sum = 0; 
例如,数组必须以0结尾

int array[] = {1,2,3,4,5,6,0};
一些错误:

while(*arr++) {
    l->sum += *arr; 
    //*arr++;
}
您将在arr增量之后添加*arr

为了说明这个问题:

它必须是:

while(*arr) {
    l->sum += *arr++; 
    //*arr++;
}
malloced内存未初始化,并且结构成员具有未确定的值—它可以是任何内容。在循环之前,您需要

    l->sum = 0; 
例如,数组必须以0结尾

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

函数create_list有两个问题

第一个问题是数据成员和没有初始化

第二个是由于while循环条件下的post增量,数组的第一个元素被忽略

    while(*arr++) {
你至少应该写信

    while(*arr) {
        l->sum += *arr; 
        arr++;
    }
请注意,在将控件传递给while循环之前,应检查是否已成功为intlist类型的对象分配了内存

函数要求数组包含sentinel值等于0的元素

如果该函数必须处理没有sentinel值元素的数组,则必须声明第二个参数,该参数将指定传递的数组中有多少元素

请注意,第一个参数应该具有限定符const,因为传递的数组在函数中没有更改

这就是函数应该声明为

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

函数create_list有两个问题

第一个问题是数据成员和没有初始化

第二个是由于while循环条件下的post增量,数组的第一个元素被忽略

    while(*arr++) {
你至少应该写信

    while(*arr) {
        l->sum += *arr; 
        arr++;
    }
请注意,在将控件传递给while循环之前,应检查是否已成功为intlist类型的对象分配了内存

函数要求数组包含sentinel值等于0的元素

如果该函数必须处理没有sentinel值元素的数组,则必须声明第二个参数,该参数将指定传递的数组中有多少元素

请注意,第一个参数应该具有限定符const,因为传递的数组在函数中没有更改

这就是函数应该声明为

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

我现在注意到,当我到达数组的末尾时,while循环并没有结束,而是继续了几个循环。我该如何解决这个问题?发布一个完整的程序,而不仅仅是它的片段。这是否回答了你的问题?我现在注意到,当我到达数组的末尾时,while循环并没有结束,而是继续了几个循环。我该如何解决这个问题?发布一个完整的程序,而不仅仅是它的片段。这是否回答了你的问题?我可以用非整数数据终止吗?我可能在一个数字数组中有一个0,或者我的列表中基本上可以有任何整数。我尝试添加一个NAN,并尝试在末尾添加一个\0,但没有成功。我是否可以使用非整数数据终止?我可能在一个数字数组中有一个0,或者我的列表中基本上可以有任何整数。我尝试添加一个NAN,并尝试在末尾添加一个\0,但没有成功。