xcode 数组在赋值后保持为空

nx7onnlm  于 2023-03-31  发布在  其他
关注(0)|答案(3)|浏览(112)

执行此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区域。

rvpgvaaj

rvpgvaaj1#

变量t被声明为double *类型的指针。
因此表达式sizeof(t)/sizeof(t[0])等价于sizeof( double * ) / sizeof( double ),并且不会产生分配的数组中的元素数。
在这份声明中

printf("%lu\n", sizeof(t)/sizeof(t[0]);

这里有一个打印错误。你需要再加一个右括号。
虽然类型size_t通常被定义为类型unsigned long的别名,但使用转换说明符%zu而不是%lu更正确,因为C标准允许在某些实现中将其定义为类型unsigned long long的别名。
在这个表达式(j/10)中也使用了整数运算。所以它的值总是0。你应该写(j/ 10.0)来将表达式的操作数转换为公共类型double

oaxa6hgo

oaxa6hgo2#

指针上的sizeof返回指针的大小,而不是指向的数据。
sizeof技巧只适用于数组。
注意sizeof返回size_t,而不是unsigned long。正确的格式说明符是%zu
没有办法得到指针所指向的元素的数量,你必须自己跟踪它的大小。

size_t size = 10;

另一种方法是将其定义为数组:

double array[10];

现在,sizeof习惯用法可以使用了。

t[j] = 5 * powl((j/10), 0.4);

由于整数运算,此表达式始终等于0。您应该写(j / 10.0)- Vlad from莫斯科
强制转换不是必需的。它只会使代码变得混乱。malloc(3)返回NULL以指示失败,如果不检查它,则会有调用未定义行为的风险。

xfyts7mz

xfyts7mz3#

sizeof给出的是对象的大小。在本例中,sizeof(t)给出的是指针的大小
要查看数组的大小,需要将其定义为数组

double t[10];

printf("%zu\n", sizeof(t)/sizeof(t[0]);

相关问题