C中的打印数组函数仅打印第一个元素

时间:2012-10-04 07:52:58

标签: c arrays

  

可能重复:
  How to get the size of dynamically allocated 2d array

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

问题是它只打印第一个数组元素,即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));
}

3 个答案:

答案 0 :(得分:3)

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

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

注意:

  • free()您拥有的内容malloc() d。
  • 不需要转换malloc()的返回值。
  • 检查scanf()的返回值以确保成功。

答案 1 :(得分:1)

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

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

答案 2 :(得分: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

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