计算函数内数组中的元素

时间:2015-05-20 10:44:53

标签: c

我知道有类似的问题被问到,但我需要一些解释: 有一个代码:

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

int count_pieces(double *array){
    int i = 0;
    while(*(array + i)){  
        i++;
    }
    return i;
}
int main()
{   
    int i;
    int n=1005;
    double r[n];
    for(i=0;i<n;i++){
        *(r+i) = 100.0;
        printf("%f\n", *(r+i));
    }
    printf("\n----------------------\n");
    printf("N=%d",count_pieces(r)); 
    printf("\n----------------------\n");
    return 1;
}

count_pieces()来自know-all.net,并且适合双倍。一切都很精细。但! - 当我评论行:printf("%f\n", *(r+i));它变得难以理解!为什么?发生了什么?

2 个答案:

答案 0 :(得分:3)

您无法计算double数组中的项目,该技术用于字符串,因为在c字符串中有一个特殊的最后一个值'\0',基本上是0,因此它可以在循环中用作真值,以帮助计算字符或为任何其他目的找到字符串的结尾。

特别是在您的情况下,所有元素都是100.0,那么为什么期望while (*(array + i))甚至开始循环?

此外,您需要明确*(array + i)array[i]相同的语法,并且两者中的哪一个更好。

在c中你需要跟踪一个数组的元素数量,如果你想要&#34; 虽然我不喜欢&#34;你可以使用结构

struct DoubleArray  
{
    double *data;
    size_t  size;
};

然后您可以使用函数初始化,取消初始化,设置/获取值等,例如

struct DoubleArray *new_double_array(size_t size)
{
    struct DoubleArray *array;
    array = malloc(sizeof(*array));
    if (array == NULL)
        return NULL;
    array->data = malloc(size * sizeof(double));
    if (array->data == NULL)
    {
        free(array);
        return NULL;
    }
    array->size = size;

    return array;
}

然后我建议将此结构不透明,即从结构用户隐藏它的字段,这样就可以防止滥用字段。

答案 1 :(得分:1)

正如我所看到的,在你的代码中,

while(*(array + i)){ 

不包括对索引i的任何边界检查。因此,它会造成内存溢出,因此您将面临undefined behaviour

评论printf("%f\n", *(r+i)); 没有任何影响。

此外,您的count_pieces()功能存在根本问题。在不检查输入参数array是否为NULL的情况下,您开始遵循它。如果使用NULL参数调用该函数,则会导致严重问题。你应该先检查一下。