数组在赋值后保持为空

Array stays empty after assignment

提问人:Max 提问时间:3/28/2023 最后编辑:HangarRashMax 更新时间:3/29/2023 访问量:68

问:

执行此 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]);           
}

我的数组只存储了,我的数组的大小是 。01

我正在使用 Xcode。打开线程清理程序后,我收到无法在 vm-space 中分配内存的错误。malloc

malloc:由于无法预分配预留的 VM 空间,已放弃 Nano 区域。

数组 c xcode malloc sizeof

评论

1赞 Vlad from Moscow 3/28/2023
此语句 printf(“%lu\n”, sizeof(t)/sizeof(t[0]); 没有意义,因为 t 不是数组。它是一个指针。
1赞 Vlad from Moscow 3/28/2023
此外,由于整数算术,该表达式 (j/10) 始终等于 0。你应该写 ( j / 10.0 )
0赞 Jabberwocky 3/28/2023
绝对没有办法获取指针指向的元素数。你需要自己处理这个问题。

答:

2赞 Harith 3/28/2023 #1

sizeofon a pointer 返回指针的大小,而不是指向数据的大小。

这个技巧只适用于数组。sizeof

请注意,返回的是 ,而不是 .正确的格式说明符是 。sizeofsize_tunsigned 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

评论

0赞 Harith 3/28/2023
t是一个指针。它不是一个数组。它没有元素。
0赞 Max 3/28/2023
你是对的。不能解决我的问题
0赞 Harith 3/28/2023
@Max我添加到答案中。
1赞 0___________ 3/28/2023 #2

sizeof为您提供对象的大小。在你的情况下,给出了足尖的大小sizeof(t)

要查看数组的大小,您需要将其定义为数组

double t[10];

printf("%zu\n", sizeof(t)/sizeof(t[0]);
2赞 Vlad from Moscow 3/28/2023 #3

该变量被声明为 类型的指针。tdouble *

因此,表达式等价于分配的数组中的元素数,并且不产生元素数。sizeof(t)/sizeof(t[0])sizeof( double * ) / sizeof( double )

同样在本声明中

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

有一个错别字。您需要再添加一个右括号。

尽管类型通常被定义为类型的别名,但使用转换说明符更正确,而不是因为 C 标准允许在某些实现中将其定义为类型的别名。size_tunsigned long%zu%luunsigned long long

在这个表达式中还使用了整数算术。因此,它的计算结果始终为 0。您应该编写以将表达式的操作数转换为通用类型。(j/10)(j/ 10.0)double