使用scanf分配指针的整数

问题描述 投票:0回答:2

我有一个类似于这个的问题: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,这是我猜的初始值。知道我做错了什么吗?

感谢您提供的任何帮助,非常感谢。

c dynamic malloc scanf allocation
2个回答
1
投票

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


1
投票

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

因为变量sum没有初始化,默认它包含一些由于自动存储而导致的垃圾数据。

用零初始化它。

long sum = 0;

也在这里

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

由于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 +2pi + 3 .. pi + 9未使用。所以改成它

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

示例代码:

int main(void) {
    long sum = 0;
    int *pi = malloc(10 * sizeof(*pi));
    if(pi == NULL) {
        /* @TODO 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);
        sum += *(pi + i);
    }
    printf("\nSum of dynamic allocated memory: %ld", sum);
    free(pi);
    return 0;
}

O / p:

请输入10个值。

  1. 价值:1
  2. 价值:2
  3. 价值:3
  4. 价值:4
  5. 价值:5
  6. 价值:6
  7. 价值:7
  8. 价值:8
  9. 价值:9
  10. 价值:10

动态分配内存总和:55

© www.soinside.com 2019 - 2024. All rights reserved.