2016-11-08 66 views
-1

我已经定义像这样的结构体:递增值指向由INT *从结构*

typedef struct { 
    char* name; 
    int* numVotes; 
} candidate; 

分配像这样:

candidate* Person[10]; 
int i; 
for (i = 0; i < 10; i++) { 
    Person[i] = malloc(sizeof(candidate)); 
    Person[i]->name = malloc(25*sizeof(char)); 
    Person[i]->numVotes = malloc(sizeof(int)); 
} 

试图递增存储在numVotes像这样的值:

int v; 
    scanf("%d",&v); 
    while (v != 0) { 
    switch (v) { 
     case 1 : 
     Person[0]->numVotes++; 
     break; 
     case 2 : 
     Person[1]->numVotes++; 
     break; 
     case 3 : 
     Person[2]->numVotes++; 
     break; 
     case 4 : 
     Person[3]->numVotes++; 
     break; 
     case 5 : 
     Person[4]->numVotes++; 
     break; 
     case 6 : 
     Person[5]->numVotes++; 
     break; 
     case 7 : 
     Person[6]->numVotes++; 
     break; 
     case 8 : 
     Person[7]->numVotes++; 
     break; 
     case 9 : 
     Person[8]->numVotes++; 
     break; 
     case 10 : 
     Person[9]->numVotes++; 
     break; 
     default : 
     printf("Spoiled vote\n"); 
     break; 

    } 
    scanf("%d",&v); 
    } 

但是,当打印结果我相信这是增加numVotes指向的内存地址。另外,当试图释放内存时,它给了我无效的指针。我如何只增加Person [i] - > numVotes指向的值(不是内存地址)?谢谢。

+2

只使用添加

memset(Person[i]->numVotes , 0, sizeof (int)); 

'INT numVotes',唐当你只需要一个整数时,不要在整数上声明一个指针(并且不要用'malloc') –

+1

@ Jean-FrançoisFabre:你知道他们在说什么。当你学习使用锤子时,一切看起来都像钉子。 – StoryTeller

+1

提示:如果有100个候选而不是10个,你的代码将如何? –

回答

1

我同意你不应该使用* int,你应该使用int。 但是如果你必须

++(*Person[2]->numVotes); 
.... 
printf(%d, *Person[2]->numVotes); 

也似乎你忘了初始化为零你会得到垃圾值总是那么在你的for循环

+0

为什么在提领指针之前增量? – user7038946

+0

由于括号解引用工作首先,所以我不相信这将是一个问题。这里并不重要,但如果可能的话,这是一个很好的习惯,使用预增加操作符而不是后增量操作符。由于后增加增加了返回可能在大对象中具有性能效果的副本。 –

0

只要使用int numVotes,当你只需要一个整数时,不要在整数上声明一个指针。你在这里递增指针。

BTW你的数据是全局静态的,所以你可以写所有的代码,而指针:

typedef struct { 
    char name[25]; 
    int numVotes; 
} candidate; 

“分配”(顺便说一句,这也初始化的numVotes的价值,这是必需的或您numVotes值将是假的):

candidate Person[10]; 
int i; 
for (i = 0; i < sizeof(Person)/sizeof(candidate); i++) { 
    Person[i].numVotes = 0; 
} 

然后在互动循环(这可大大减少,因为没有必要为case这里)只是做:

while(1) 
{ 
// expect 1 => 10 or 0 to stop 
scanf("%d",&v); 
if (v==0) break; 
v--; 
if ((v>=0) && (v<(int)sizeof(Person)/sizeof(candidate)) 
{ 
    Person[v].numVotes++; 
} 
else 
{ 
    printf("spoiled vote\n"); 
} 
}