执行此C代码时:
double *t = (double*) malloc(10 * sizeof(double));
printf("%lu\n", sizeof(t)/sizeof(t[0]);
for (int j = 0; j < 10; j++) {
t[j] = 5 * powl((j/10), 0.4);
printf("t_j: %lf\n", t[j]);
}
我的数组只存储了0
,数组的大小是1
。
我正在使用Xcode。打开线程消毒器后,我得到一个错误,即malloc
无法在vm-space中分配内存。
malloc:由于无法预先分配保留的虚拟机空间,因此放弃了nano区域。
3条答案
按热度按时间rvpgvaaj1#
变量
t
被声明为double *
类型的指针。因此表达式
sizeof(t)/sizeof(t[0])
等价于sizeof( double * ) / sizeof( double )
,并且不会产生分配的数组中的元素数。在这份声明中
这里有一个打印错误。你需要再加一个右括号。
虽然类型
size_t
通常被定义为类型unsigned long
的别名,但使用转换说明符%zu
而不是%lu
更正确,因为C标准允许在某些实现中将其定义为类型unsigned long long
的别名。在这个表达式
(j/10)
中也使用了整数运算。所以它的值总是0。你应该写(j/ 10.0)
来将表达式的操作数转换为公共类型double
。oaxa6hgo2#
指针上的
sizeof
返回指针的大小,而不是指向的数据。sizeof
技巧只适用于数组。注意
sizeof
返回size_t
,而不是unsigned long
。正确的格式说明符是%zu
。没有办法得到指针所指向的元素的数量,你必须自己跟踪它的大小。
另一种方法是将其定义为数组:
现在,
sizeof
习惯用法可以使用了。由于整数运算,此表达式始终等于
0
。您应该写(j / 10.0)- Vlad from莫斯科强制转换不是必需的。它只会使代码变得混乱。
malloc(3)
返回NULL
以指示失败,如果不检查它,则会有调用未定义行为的风险。xfyts7mz3#
sizeof
给出的是对象的大小。在本例中,sizeof(t)
给出的是指针的大小要查看数组的大小,需要将其定义为数组