我在这里有这个代码,我觉得应该可行,而且确实如此!虽然虽然我已经声明了一个指向double类型数组的指针,但它总是存储int,我不知道为什么。
首先,我有这个结构,它定义如下:
struct thing {
int part1;
double *part2;
};
然后我通过说struct thing *abc = malloc (sizeof(struct thing))
和part1 = 0
以及part2 = malloc(sizeof(double))
来初始化该事物。
然后,我尝试在double数组中的特定位置设置特定值。这适用于整数,但是当我尝试0.5时,它将值设置为0.当我尝试2.9时,它将值设置为2.我真的不知道为什么会这样做。 setValue的代码如下所示:
struct thing *setValue (struct thing *t, int pos, double set){
if (t->part1 < pos){ // check to see if array is large enough
t->part2 = realloc (t->part2, (pos+1) * sizeof(double));
for (int a = t->part1 + 1; a < pos + 1; a++)
t->part2[a] = 0;
t->part1 = pos;
}
t->part2[pos] = set; // ALWAYS stores an integer, don't know why
return t;
}
- 编辑:所以这部分没有什么真正的恶意;但这是我的其余代码JUST IN CASE:
对我的struct thing进行操作的相关函数
#include "thing.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
struct thing *makeThing(){ // GOOD
struct thing *t = (struct thing *) malloc (sizeof(struct thing));
t->part1 = 0;
t->part2 = malloc (sizeof(double));
t->part2[0] = 0;
return t;
}
struct thing *setValue (struct thing *t, int pos, double set){
if (t->part1 < pos){ // check to see if array is large enough
t->part2 = realloc (t->part2, (pos+1) * sizeof(double));
for (int a = t->part1 + 1; a < pos + 1; a++)
t->part2[a] = 0;
t->part1 = pos;
}
t->part2[pos] = set; // ALWAYS stores an integer, don't know why
return t;
}
double getValue (struct thing *t, int pos){
if (pos <= t->part1){
return t->part2[pos];
}
return 0;
}
标题文件:
#ifndef THING_H
#define THING_H
struct thing {
int part1;
double *part2;
};
struct thing *makeThing();
struct thing *setValue (struct thing *t, int pos, double set);
double getValue (struct thing *t, int pos);
#endif
主文件:
#include <stdio.h>
#include "thing.h"
int main (void)
{
struct thing *t = makeThing();
setValue (t, 1, -1);
setValue (t, 1, -2);
setValue (t, 10, 1);
setValue (t, 3, 1.5);
printf ("%g\n", getValue (t, 0));
printf ("%g\n", getValue (t, 1));
printf ("%g\n", getValue (t, 2));
printf ("%g\n", getValue (t, 3));
printf ("%g\n", getValue (t, 4));
printf ("%g\n", getValue (t, 5));
printf ("%g\n", getValue (t, 6));
printf ("%g\n", getValue (t, 7));
printf ("%g\n", getValue (t, 8));
printf ("%g\n", getValue (t, 9));
printf ("%g\n", getValue (t, 10));
return 0;
}
在我的电脑上打印出: 0 -2 0 1 0 0 0 0 0 0 1
编辑:事实证明,当我通过代码块进行编译时,它可以工作......
最终,我很困惑。
答案 0 :(得分:1)
在C中双重转换为int?
不,它没有。将double
值分配给对象类型double
时,无法进行任何转换。
您的问题不在您展示的代码中;它在其他地方(你打印的方式,一些愚蠢的#define
,还有其他一些东西)。
哦!你真的应该确保realloc()
的工作。否则,用户可能会得到一个稍微错误的值而不是错误......
正如我在评论中所说,your code works as expected at ideone。
答案 1 :(得分:0)
我认为您可能在打印时弄乱了格式说明符。确保为正确的数据类型提供正确的说明符。
我知道当我在Objective-C代码中更改数据类型时,有时会发生这种情况。 :)