提问人:Max 提问时间:3/28/2023 最后编辑:HangarRashMax 更新时间:3/29/2023 访问量:68
数组在赋值后保持为空
Array stays empty after assignment
问:
执行此 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。打开线程清理程序后,我收到无法在 vm-space 中分配内存的错误。malloc
malloc:由于无法预分配预留的 VM 空间,已放弃 Nano 区域。
答:
sizeof
on a pointer 返回指针的大小,而不是指向数据的大小。
这个技巧只适用于数组。sizeof
请注意,返回的是 ,而不是 .正确的格式说明符是 。sizeof
size_t
unsigned long
%zu
无法获取指针指向的元素数。您自己跟踪了尺寸。
size_t size = 10;
另一种方法是将其定义为数组:
double array[10];
现在这个成语会起作用了。sizeof
t[j] = 5 * powl((j/10), 0.4);
此表达式始终等于整数算术。 你应该写 ( j / 10.0 ) – 来自莫斯科的弗拉德
0
石膏不是必需的。它只会使一个人的代码混乱。 返回以指示失败,如果不检查它,则可能会调用未定义的行为。malloc(3)
NULL
评论
t
是一个指针。它不是一个数组。它没有元素。
sizeof
为您提供对象的大小。在你的情况下,给出了足尖的大小sizeof(t)
要查看数组的大小,您需要将其定义为数组
double t[10];
printf("%zu\n", sizeof(t)/sizeof(t[0]);
该变量被声明为 类型的指针。t
double *
因此,表达式等价于分配的数组中的元素数,并且不产生元素数。sizeof(t)/sizeof(t[0])
sizeof( double * ) / sizeof( double )
同样在本声明中
printf("%lu\n", sizeof(t)/sizeof(t[0]);
有一个错别字。您需要再添加一个右括号。
尽管类型通常被定义为类型的别名,但使用转换说明符更正确,而不是因为 C 标准允许在某些实现中将其定义为类型的别名。size_t
unsigned long
%zu
%lu
unsigned long long
在这个表达式中还使用了整数算术。因此,它的计算结果始终为 0。您应该编写以将表达式的操作数转换为通用类型。(j/10)
(j/ 10.0)
double
评论