我知道有类似的问题被问到,但我需要一些解释: 有一个代码:
#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));
它变得难以理解!为什么?发生了什么?
答案 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参数调用该函数,则会导致严重问题。你应该先检查一下。