用scanf分配指针的int

时间:2019-05-01 10:39:37

标签: c dynamic malloc scanf allocation

我有一个与此问题类似的问题:Assigning char array of pointers with scanf

我不是将char值分配给一个指针数组,而是想使用scanf将值分配给int指针。在下面的示例中,我将分配10个int值,这就是为什么对其进行硬编码的原因。

void main(void) {
    int *pi;

    long sum;

    pi = (int *)malloc(10 * sizeof(int));

    if(pi == NULL)
        /* Error Handling */

    printf("\n\nPlease put in 10 values.\n\n");

    for(int i = 0; i < 10; i++) {
        printf("%d. Value: ", i + 1);
        scanf("%d", pi + i);
        /* It was scanf("%d", pi + 1) in previous version. */

        sum += *(pi + i);
        /* Same issue, it was sum += *(pi + 1) in the previous version. */
    }

    printf("\nSum of dynamic allocated memory: %ld", sum);

    free(pi);
}

在插入10个值之后,输出为6474931,我想这是初始值。知道我在做什么错吗?

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

应该是(pi + i),而不是(pi + 1)。

答案 1 :(得分:1)

  

插入10个值后,输出为6474931,我想这是初始值吗?

这是因为变量sum未初始化,默认情况下,由于自动存储,它包含一些垃圾数据

将其初始化为零。

long sum = 0;

也在这里

pi = (int *)malloc(10 * sizeof(int));
不需要{p> typecasting malloc(),因为malloc()返回类型是void*类型,并且可以安全地自动转换为所需的指针类型。对于例如

pi = malloc(10 * sizeof(*pi));
if(pi == NULL) {
  /* @TODO error handling */
}

阅读Do I cast the result of malloc?

也在这里

scanf("%d", pi + 1);
sum += *(pi + 1);

您希望每次在相同的pi + i内存位置,scanf("%d", pi + 1);pi+1等其他内存位置中扫描数据时,都将pi +2用作pi + 3 {1}}已未使用。因此将其更改为

pi + 9

示例代码:

scanf("%d", pi + i);
sum += *(pi + i);

O / p:

  

请输入10个值。

     
      
  1. 值:1
  2.   
  3. 值:2
  4.   
  5. 值:3
  6.   
  7. 值:4
  8.   
  9. 值:5
  10.   
  11. 值:6
  12.   
  13. 值:7
  14.   
  15. 值:8
  16.   
  17. 值:9
  18.   
  19. 值:10
  20.   
     

动态分配的内存总和:55