所以我有这个问题。我初始化我的结构数组的一个参数,然后我想在另一个函数中检查它。我检查过,地址与main()中的地址相同,但是vaule只是随机的。我不知道为什么,请帮助!
int i;
STOL s[STOLY];
char choice[MAXSTRING] = "jupiiiii", ***p;
/*if ((p = (char ***) malloc(MAXSTRING * sizeof(char **))) == NULL)
exit(-5);*/
for (i = 0; i < STOLY; i++)
s[i].novy = 0;
while (strcmp(choice, "stop"))
{
puts("Casnik alebo bar?");
/* *p = nacitaj_choice();
choice = *p;*/
nacitaj_choice(choice);
free(p);
if (strcmp(choice, "casnik") == 0)
zadaj_stol(0, &s); /*HERE I SEND THE ADDRESS*/
if (strcmp(choice, "bar") == 0)
zadaj_stol(1, &s);
}
我想检查另一个函数中的 novy
void zadaj_stol(int typ, STOL *p_s[STOLY])
{
int stol;
printf("Stol cislo: ");
stol = (cislo_stola() - 1);
if (!p_s[stol]->novy) /*HERE IS THE PROBLEM*/
reset_stol(p_s[stol]);
zadaj_udaj(typ, p_s[stol]);
vypis_stol(p_s[stol]);
}
我查了一下,p_s与&amp; s相同,但出于某种原因,p_s [stol] - &gt; novy总是像-3782126。 btw stol介于0到13之间
因为我还不能回答我的问题,这是我想出的部分解决方案。 问题是,它只有在p_s的索引为0时才有效,即p_s [0] - &gt; novy工作正常,但p_s [1]给出调用堆栈,它不知道地址。我不确定为什么。
int main()
{
int i;
STOL s[STOLY], **p_s;
if ((p_s = (STOL **) malloc(sizeof(STOL))) == NULL)
return -5;
*p_s = s;
char choice[MAXSTRING] = "jupiiiii";
for (i = 0; i < STOLY; i++)
s[i].novy = 0;
while (strcmp(choice, "stop"))
{
puts("Casnik alebo bar?");
nacitaj_choice(choice);
if (strcmp(choice, "casnik") == 0)
zadaj_stol(0, p_s);
if (strcmp(choice, "bar") == 0)
zadaj_stol(1, p_s);
}
return 0;
}
void zadaj_stol(int typ, STOL **p_s)
{
int stol;
printf("Stol cislo: ");
stol = (cislo_stola() - 1);
if (!p_s[stol]->novy)
reset_stol(p_s[stol]);
zadaj_udaj(typ, p_s[stol]);
vypis_stol(p_s[stol]);
}
答案 0 :(得分:0)
更改此
void zadaj_stol(int typ, STOL *p_s[STOLY])
{
int stol;
printf("Stol cislo: ");
stol = (cislo_stola() - 1);
if (!p_s[stol]->novy) /*HERE IS THE PROBLEM*/
reset_stol(p_s[stol]);
zadaj_udaj(typ, p_s[stol]);
vypis_stol(p_s[stol]);
}
成为这个:
void zadaj_stol(int typ, STOL (*p_s)[STOLY])
{
int stol;
printf("Stol cislo: ");
stol = (cislo_stola() - 1);
if (!(*p_s)[stol].novy)
reset_stol((*p_s)[stol]);
zadaj_udaj(typ, (*p_s)[stol]);
vypis_stol((*p_s)[stol]);
}
答案 1 :(得分:0)
只需将&s
更改为调用该函数的s
,然后从函数的参数列表中删除[STOLY]
。
答案 2 :(得分:0)
只需将&s
更改为s
即可传递数组。您收到错误error: invalid type argument of '->'
,因为p_s
的类型为STOL*
,这意味着p_s[stol]
的类型为STOL
(不是指针)。 ->
的左侧操作数应该是指针。
你可以这样做:
if(!p_s[stol].novy)
代替。
答案 3 :(得分:0)
所以是的,我过了一会儿才解决了。万一以后任何人都有同样的问题,这就是解决方案。因为我有s[STOLY]
,结构数组s
本身就是一个指针。因此,当我想将它作为指针传递给zadaj_stol()
函数时,它应该只是s
。然后在zadaj_stol()
函数s
中有一个指针,但s[stol]
是一个结构,因此使用.
表示法。然后再次将其作为指针传递,我使用了&s[stol]
。这是示例代码(从那以后我改变了很多,但原则适用。
int main()
{
int i, io;
STOL s[STOLY];
char choice[MAXSTRING] = "jupiiiii"; /*random string*/
for (i = 0; i < STOLY; i++) {
s[i].novy = 1;
s[i].ucet = 0;
}
while (strcmp(choice, "stop"))
{
puts("\n**********************************\n");
puts("Vstup alebo vystup? (Pre navod napis help, pre ukoncenie stop)");
nacitaj_choice(choice);
if ((strcmp(choice, "vstup")) == 0) {
io = 0;
typ_vstup(s, io);
}
else if ((strcmp(choice, "vystup")) == 0) {
io = 1;
typ_vstup(s, io);
}
else if ((strcmp(choice, "help")) == 0)
help();
}
ziskaj_obrat(s);
getchar();
return 0;
}
和像这样的功能的使用
void zadaj_stol(int typ, STOL p_s[], int io) /*nacita cislo_stola, ak potrebne zresetuje ho, a bud vola zadaj_udaj alebo vypis_stol*/
{
int stol;
printf("Stol cislo: ");
stol = (cislo_stola() - 1);
if (p_s[stol].novy)
reset_stol(&p_s[stol]);
if (!io)
zadaj_udaj(typ, &p_s[stol]);
else
vypis_stol(typ, &p_s[stol]);
}
重要的是要意识到什么是价值,什么是指针。因为我有一个数组s[14]
,s
是指向数组开头的指针,s[whatever]
是一个值(在我的情况下是结构),而&s[whatever]
是一个地址/指向结构的指针。