分配数组,使用 for 循环初始化给定的任何分配大小

Allocating an array, using a for loop to initialize given any allocated size

提问人:Shaler 提问时间:9/26/2023 最后编辑:chqrlieShaler 更新时间:9/26/2023 访问量:49

问:

    int *p_numbers;
    p_numbers = malloc((sizeof *p_numbers) * 10);
    if (p_numbers == NULL)
        exit(EXIT_FAILURE);

    for (int i = 0; i < sizeof(p_numbers) / sizeof(*p_numbers); i++) {
        printf("-> %p\n\n", p_numbers);
        p_numbers[i] = 0;
    }

寻找一个能够找到分配数组大小的操作,以便这个 for 循环可以处理任何分配的大小,而不仅仅是 I < 10。

for(i = 0; i < 10; i++) 

我目前的尝试只是为 sizeof(p_numbers) 获得 8,而不是像我预期的那样获得 40,但 sizeof(*p_numbers) 返回我预期的类型大小。

我的猜测是sizeof(p_numbers)返回8,因为指向int的指针是 总共 2 个整数(本身及其指向的内容)。 但我不知道我如何让它达到分配大小的大小,而不仅仅是本机数字。

我是初学者,所以..我想这有用,如果没有,请告诉我。

数组 c 指针 sizeof allocation

评论

0赞 Joel 9/26/2023
我认为这是不可能的。只需将值保存在变量/定义中,并将其用于循环。如果你的指针大小为 8 个字节,那么你使用的是 64 位计算机,所有指针,无论类型如何,都将具有该大小,因为指针只是内存中的地址。这意味着 and any other 指针都是真的。10malloc()sizeof(void*) == sizeof(int*) && sizeof(int*) == sizeof(char*)
1赞 Some programmer dude 9/26/2023
当你有一个指针时,指针就是你所拥有的一切。编译器不知道指针指向什么,是否指向数组的第一个元素,也不知道此类数组的可能大小。始终保存在变量中分配的大小(元素数),并在需要大小时使用该变量。
0赞 Joel 9/26/2023
可能的重复
1赞 Ted Lyngmo 9/26/2023
解决方案很可能是删除魔术并将其替换为 or - 然后在分配和循环时同时使用两者。10#define SOMETHING_MEANINGFUL (10)enum { SOMETHING_MEANINGFUL = 10 };SOMETHING_MEANINGFUL
0赞 arfneto 9/26/2023
正在寻找一个可以找到已分配数组大小的操作...好吧,你已经这样做了:这是你的代码,它计算了你传递给的表达式作为你需要的块的大小。只是使用它。你写了 大小也是如此。然后呢.然后在循环中使用...mallocmalloc((sizeof *p_numbers) * 10);10size=10malloc(size)size

答:

2赞 chqrlie 9/26/2023 #1

该表达式不适用于指针,仅适用于定义的数组。您无法从指针确定已分配数组的大小,您必须使用单独的变量跟踪已分配的大小,或者像使用分配一样使用常量。sizeof(p_numbers) / sizeof(*p_numbers)10