我的程序有问题。我正在尝试通过指针数组。找到正确的指针后,程序将打印所有已访问的指针。我在以下位置收到错误消息:

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

10-06 06:05