我有一个与此问题类似的问题: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,我想这是初始值。知道我在做什么错吗?
非常感谢您的帮助。
答案 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
- 值:2
- 值:3
- 值:4
- 值:5
- 值:6
- 值:7
- 值:8
- 值:9
- 值:10
动态分配的内存总和:55