我的程序有问题。我正在尝试通过指针数组。找到正确的指针后,程序将打印所有已访问的指针。我在以下位置收到错误消息:
void * temp=debut[k];
ajouter(temp[k], resultat);
它说:“无效的价值不应该被忽略”
我不明白为什么?
预先感谢您的帮助
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
int calculerTaille(void * pointeur);
void ajouter(void * pointeur, char * resultat[]);
int verifier(void * debut, void * fin);
void * A[3];
void * D[3];
void * F[2];
void * G[4];
void * H[4];
void * J[3];
void * K[5];
void * L[4];
void * M[5];
int i = 0;
char * resultat[100];
int main(int argc, char * argv[]) {
A[0] = D;
A[1] = H;
A[2] = K;
D[0] = A;
D[1] = G;
D[2] = H;
F[0] = K;
F[1] = L;
G[0] = D;
G[1] = H;
G[2] = J;
G[3] = M;
H[0] = A;
H[1] = G;
H[2] = L;
H[3] = M;
J[0] = G;
J[1] = L;
J[2] = M;
K[0] = A;
K[1] = F;
K[2] = H;
K[3] = L;
K[4] = M;
L[0] = F;
L[1] = J;
L[2] = K;
L[3] = M;
M[0] = G;
M[1] = H;
M[2] = J;
M[3] = K;
M[4] = L;
void * debut = A;
void * fin = J;
ajouter(J, resultat);
while (verifier(debut, fin) != 1) {
srand(time(0));
int k = rand() % calculerTaille(K);
void * temp=debut[k]; //error
ajouter(temp[k], resultat); //error
}
int l=0;
for(l=0; resultat[l]!=NULL;l++) printf("%s ", resultat[l]);
return 0;
}
void ajouter(void * pointeur, char * resultat[]) {
if (pointeur == A)
resultat[i] = "A";
if (pointeur == D)
resultat[i] = "D";
if (pointeur == F)
resultat[i] = "F";
if (pointeur == G)
resultat[i] = "G";
if (pointeur == H)
resultat[i] = "H";
if (pointeur == J)
resultat[i] = "J";
if (pointeur == K)
resultat[i] = "K";
if (pointeur == L)
resultat[i] = "L";
if (pointeur == M)
resultat[i] = "M";
i++;
}
int verifier(void * debut, void * fin) {
if (debut == fin)
return 1;
else
return 0;
}
int calculerTaille(void * pointeur) {
if (pointeur == A)
return 3;
if (pointeur == D)
return 3;
if (pointeur == F)
return 2;
if (pointeur == G)
return 4;
if (pointeur == H)
return 4;
if (pointeur == J)
return 3;
if (pointeur == K)
return 5;
if (pointeur == L)
return 4;
if (pointeur == M)
return 5;
}
最佳答案
debut
是类型void *
的指针。您不能将[]
运算符与类型为void *
的指针一起使用。在C中是非法的。这在您的代码中意味着什么?
显然,您的编译器允许您将[]
和debut
用作特定于编译器的扩展名(尽管这在C语言中是非法的)。但是,debut[k]
的结果是类型为void
的“左值”。您无法阅读void
。您不能将void
分配给任何内容。那根本没有任何意义。通过尝试读取debut[k]
的“值”,您试图说什么?
考虑到您的评论,显然您需要的是debut
声明为
void **debut;
请注意两个星号。
同样,如果您想通过独立的指针
void * A[3]
访问数组debut
的元素,则必须按照以下方式声明和初始化指针debut
void **debut = A;
这样,访问
debut[k]
实际上将访问A[k]
。fin
同样。实际上,您的程序包含此错误的许多独立实例(另请参见函数参数),尽管其中有些比debut[k]
更“宽容”。附言您的循环将无限循环,因为您既不会更改
debut
也不会更改fin
。