C中指针数组的问题

时间:2011-08-31 21:12:33

标签: c arrays void

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

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;

}

5 个答案:

答案 0 :(得分:3)

tempdebut是无效指针 - 由于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)

debutvoid *类型的指针。您不能将[]运算符与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。你的周期将无限循环,因为你永远不会改变debutfin

答案 4 :(得分:0)

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