我有一个类似于这个的问题: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,这是我猜的初始值。知道我做错了什么吗?
感谢您提供的任何帮助,非常感谢。
而不是(pi + 1)它应该是(pi + i)。
插入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 +2
,pi + 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
- 价值:2
- 价值:3
- 价值:4
- 价值:5
- 价值:6
- 价值:7
- 价值:8
- 价值:9
- 价值:10
动态分配内存总和:55