我有一个如此定义的结构:
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指向的值(不是内存地址)?谢谢。
答案 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");
}
}