从struct *中增加int *指向的值

时间:2016-11-08 20:22:16

标签: c struct

我有一个如此定义的结构:

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] - &gt; numVotes指向的值(不是内存地址)?谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

似乎你忘记了零初始化你将获得垃圾值总是如此添加

memset(Person[i]->numVotes , 0, sizeof (int));
在你的for循环中

答案 1 :(得分:0)

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

BTW您的数据是全局静态的,因此您可以编写所有代码而无需指针:

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

&#34;分配&#34; (顺便说一下,这也会初始化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");
 }
}