我的程序有问题。我试图通过一系列指针运行。一旦找到正确的指针,程序将打印所有已访问过的指针。我收到错误消息:
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;
}
答案 0 :(得分:3)
temp
和debut
是无效指针 - 由于void
没有定义的大小,因此数组索引运算符不能用于该类型的指针(对象有多大{ {1}}指向?)。
答案 1 :(得分:1)
debut
是一个void指针,如果不将其转换为另一个指针类型,则无法取消引用void指针。数组下标运算符[]
通过添加偏移量有效地取消引用基指针。
答案 2 :(得分:1)
你不能在算术中使用void*
...所以基本上当你说debut[k]
时,需要对指针值进行加法操作,这是你做不到的......你必须先将指针值强制转换为另一个指针类型,然后再添加它。
老实说,debut
的类型实际上应该是void**
,因为它指向数组A
,它是一个指向指针的数组。你可以索引它。因此,请将您的声明更改为以下内容:
void ** debut = A;
现在它实际上可以添加到debut
,因为它知道它指向的值是一个指针,因此可以增加平台上指针的大小。您仍然无法拨打temp[k]
之类的电话,因为现在temp
属于void*
类型,但至少debut[k]
有效。
最终可能最好实际生成类型long
的数组,或者平台上指针的大小......然后你可以对这些类型进行指针运算并正确地偏移到数组。这些值将是相同的,因为存储的值只是作为整数值的地址...它看起来不像你实际上做了很多的引用,只是等于检查,所以这可以工作。否则,您需要对long
或者平台上指针的大小进行强制转换,这样您就可以正确地进行必要的索引以偏移到数组中。
答案 3 :(得分:0)
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]
更“宽容”。
P.S。你的周期将无限循环,因为你永远不会改变debut
和fin
。
答案 4 :(得分:0)
我不相信你可以索引到一个void *,因为编译器如何知道要跳转多少字节(即索引)。您可能需要先进行投射,然后再进行索引。