在这个程序中,我被要求只使用void函数中的指针
#include <stdio.h>
#include "power.c"
#define SIZE 20
int count = 0;
void test(int *n, int *o) {
long long sum = 0, temp;
int remainder, digits = 0;
int i;
int a[SIZE];
temp = *n;
while (temp != 0) {
digits++;
temp = temp/10;
}
temp = *n;
while (temp != 0) {
remainder = temp%10;
sum = sum + power(remainder, digits);
temp = temp/10;
}
if (*n == sum)
{
count++;
a[count] = *n;
}
o = a;
for(i=1;i<=count;i++){
printf("*******%i,%d\n",i,o[i]);
}
}
这是测试台
#include <stdio.h>
#define SIZE 20
int main () {
int c, a, b;
int *x;
int *y;
int i;
a = 2 ;
b = 1000;
//b = 345678910;
for (c = a; c <= b; c++) {
x = &c;
test(x,y);
}
}
打印出类似
的内容******* 1,2- ******* 2,3 ******* 12407
这些值是正确的但是我想在测试台上调用test之后打印y的每个元素,并期望这些值与上面的值类似,但我不知道该怎么做。我正在寻求你的帮助。
此致 贝
答案 0 :(得分:0)
答案是,在调用test
后,您无法打印值。原因是a
在test
返回时超出范围。换句话说 - y
根本没有指向有效的内存,任何访问它的尝试都可能导致程序崩溃。
您有以下问题:
1)y
在test
返回时指向无效内存(如上所述)
2)count
不应是全球性的
3)count
应该从零而不是一个
那看起来:
// int count = 0; Don't make it global
void test(int *n, int *o, int* cnt)
{
....
int count = 0;
int* a = malloc(SIZE * sizeof(int));
....
if (*n == sum)
{
a[count] = *n; // Switch the two statements to index from zero
count++;
}
o = a;
*cnt = count; // Return the value of count
for(i=0;i<count;i++){ // Notice this change - start index from zero
printf("*******%i,%d\n",i,o[i]);
}
}
int main () {
int count;
....
test(x, y, &count); // Pass a pointer to count
// Now print y
for(i=0; i<count; i++){
printf("*******%d\n", y[i]);
}
free(y); // Release memory when done with it
动态内存分配的替代方法是在main中声明数组:
int main () {
int count;
int y[SIZE];
....
test(x, y, &count); // Pass a pointer to count
// Now print y
for(i=0; i<count; i++){
printf("*******%d\n", y[i]);
}
并且在函数中直接使用y
而不是变量a