0

可能重复:
如何获取动态分配的二维数组的大小

我在这里找不到我做错了什么。我想创建一个其大小基于用户输入的数组,从用户输入中获取数组的数据(整数),然后打印数组整数。

问题是它只打印第一个数组元素,即intArr[0].

int main()
{
    int i, n, *intArr;

    printf("Type the array size:\t");
    scanf("%d", &n);

    intArr = (int *)malloc(n * sizeof(int));

    for (i = 0; i < n; ++i)
    {
        printf("Type a number\t");
        scanf("%d", intArr + i);
    }

    printArr(intArr);
}

void printArr(int *arr)
{
    int i; 
    for (i = 0; i < (sizeof(arr) / sizeof(*arr)); ++i)
        printf("%d ", *(arr + i));
}
4

3 回答 3

3

的类型arr是一个int*所以sizeof(arr)将是sizeof(int*)而不是元素的数量arr。在您的系统sizeof(int*)上,它sizeof(int)是相同的,结果为 1,因此循环仅打印一个元素。

将元素的数量作为参数传递给printArr()函数。

笔记:

  • free()你有什么malloc()d.
  • 强制转换返回值malloc()是不必要的。
  • 检查返回值scanf()以确保成功。
于 2012-10-04T07:54:44.563 回答
1

您不能将数组作为指针传递给函数,当数组衰减为指向其第一个元素的指针时,它将丢失有关大小的信息。

将大小作为额外的显式参数传递。

于 2012-10-04T07:55:12.440 回答
0

您没有将参数的数量传递给您的 printArr() 函数,并且它无法知道这一点。我会将元素的数量作为另一个参数传递。

“arr”的类型是一个指向整数的指针。最有可能是 4 个字节,具体取决于计算机体系结构。“*arr”的大小相同。

你可以试试:

printf("%d \n", (int) sizeof(arr));
printf("%d \n", (int) sizeof(*arr));
printf("%d \n", (int) sizeof(arr) / sizeof(*arr));

并会看到这样的输出:

4
4
1

因此,您注定只能执行一次打印循环。

于 2012-10-04T08:03:20.073 回答