【问题标题】:Assigning ints of pointer with scanf用 scanf 分配指针的整数
【发布时间】:2019-09-19 22:35:20
【问题描述】:

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

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

【问题讨论】:

  • 变量sum 未初始化。像long sum = 0一样初始化它。

标签: c dynamic malloc scanf allocation


【解决方案1】:

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

【讨论】:

  • 是的,你是对的。与此同时,我也找到了它。
【解决方案2】:

插入 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

【讨论】:

  • 导师要求类型转换,但是,我会记住它不是必需的。同时我也发现了 1 而不是 i 的错误。
猜你喜欢
  • 2015-06-12
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 2019-06-24
  • 2014-08-03
  • 1970-01-01
相关资源
最近更新 更多