C语言中指针数组的问题

C语言中指针数组的问题,c,arrays,void,C,Arrays,Void,我的程序有问题。我试图通过一系列指针运行。一旦找到正确的指针,程序将打印所有已访问的指针。我在以下位置收到错误消息: void * temp=debut[k]; ajouter(temp[k], resultat); 它说“无效值不应该被忽略” 我不明白为什么 提前谢谢你的帮助 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> int c

我的程序有问题。我试图通过一系列指针运行。一旦找到正确的指针,程序将打印所有已访问的指针。我在以下位置收到错误消息:

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;

}
#包括
#包括
#包括
#包括
整数计算器(无效*指针);
void ajouter(void*pointeur,char*resultat[]);
int验证者(无效*首次登场,无效*fin);
无效*A[3];
无效*D[3];
无效*F[2];
void*G[4];
void*H[4];
void*J[3];
void*K[5];
无效*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*A=A;
void*fin=J;
ajouter(J,resultat);
while(验证者(首次登场,fin)!=1){
srand(时间(0));
int k=rand()%calculerTaille(k);
void*temp=k];//错误
ajouter(temp[k],resultat);//错误
}
int l=0;
对于(l=0;resultat[l]!=NULL;l++)printf(“%s”,resultat[l]);
返回0;
}
void ajouter(void*pointeur,char*resultat[]){
如果(指针==A)
结果[i]=“A”;
如果(指针==D)
结果[i]=“D”;
如果(指针==F)
结果[i]=“F”;
如果(指针==G)
结果[i]=“G”;
如果(指针==H)
结果[i]=“H”;
如果(指针==J)
结果[i]=“J”;
如果(指针==K)
结果[i]=“K”;
如果(指针==L)
结果[i]=“L”;
如果(指针==M)
结果[i]=“M”;
i++;
}
int验证器(无效*首次登场,无效*fin){
如果(首次登场==fin)
返回1;
其他的
返回0;
}
整数计算尾(空*点欧元){
如果(指针==A)
返回3;
如果(指针==D)
返回3;
如果(指针==F)
返回2;
如果(指针==G)
返回4;
如果(指针==H)
返回4;
如果(指针==J)
返回3;
如果(指针==K)
返回5;
如果(指针==L)
返回4;
如果(指针==M)
返回5;
}

是类型为
void*
的指针。不能将
[]
运算符与类型为
void*
的指针一起使用。这在C语言中是非法的。这在你的代码中意味着什么

显然,您的编译器允许您将
[]
首次登场
一起使用,作为编译器特定的扩展(但在C中这是非法的)。然而,
首次登场[k]
的结果是类型为
void
的“左值”。您无法读取
无效文件
。您不能将
void
分配给任何内容。这根本没有任何意义。通过尝试读取[k]
首秀的“值”,您想说什么


考虑到您的评论,显然您需要的是
首次登场
声明为

void **debut;
注意两个星号

同样,如果您想通过独立的指针
首次登场
访问数组元素
void*A[3]
,则必须按如下方式声明和初始化指针
首次登场

void **debut = A;
通过这种方式访问[k]实际上将访问[k]

这同样适用于
fin
。事实上,您的程序包含许多此错误的独立实例(也请参见函数参数),尽管其中一些实例比[k]更“宽容”


另外,您的循环将无限循环,因为您既不会更改
首次登场
也不会更改
fin

首次登场
是一个无效指针,如果不转换为其他指针类型,则无法取消对无效指针的引用。数组下标运算符
[]
通过添加偏移量有效地解除对基指针的引用。

temp
definish
是无效指针-由于
void
没有定义的大小,数组索引运算符不能用于该类型的指针(a
void*
指向的对象有多大?).

我不相信您可以索引到一个空*中,因为编译器如何知道要跳转多少字节(即索引)。您可能需要先进行强制转换,然后进行索引。

您不能在算术中使用
void*
。。。所以基本上,当你说[k]时,需要对指针值进行加法运算,而这是你做不到的。。。您必须将该指针值强制转换为另一个指针类型,然后才能对其进行加法

老实说,
A
的类型实际上应该是
void**
,因为它指向数组
A
,数组是指向指针的指针数组。你可以把它编入索引。因此,请将您的声明更改为以下内容:

void ** debut = A;
现在它实际上可以添加到
首秀
,因为它知道它所指向的值是指针,因此可以根据平台上指针的大小进行递增。尽管如此,您仍然无法拨打类似于
temp[k]
的电话,因为现在
temp
是一种
void*
类型,但至少
首次登场[k]
是有效的


最终,最好是将
类型的数组设置为long
,或者无论平台上指针的大小如何。。。然后,您可以对这些类型执行指针算术,并正确地偏移到数组中。这些值将是相同的,因为存储的值只是作为整数值的地址。。。看起来你实际上并没有做太多的延迟,只是做了公平的检查,所以这可以奏效。否则,您将需要对
long
或平台上指针的大小进行强制转换,以便正确地进行偏移到数组中所需的索引。

程序的结构非常复杂,包含大量
if
语句等。如果其中一个