【问题标题】:problem with array of pointers in CC中指针数组的问题
【发布时间】:2011-08-31 21:12:33
【问题描述】:

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

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;

}

【问题讨论】:

  • 你的程序结构很复杂,有很多if语句等等。如果我的一个学生要编写这种代码,我会忽略他们的问题并要求他们清理代码或更好地表达他们的想法。通常,这无需任何进一步的工作就可以解决问题。
  • 如果你正在学习编写代码,问题往往不是代码是否具有功能性,而是代码是否“漂亮”——一个清晰表达的想法通常很容易编码,而且很好代码通常是清晰表达的想法的产物。
  • 您应该包含错误发生的行号,并提出一个更简单的示例来演示问题。

标签: c arrays void


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    debut 是一个 void 指针,并且 void 指针不能被取消引用而不被强制转换为另一种指针类型。数组下标运算符[] 通过添加偏移量有效地取消引用基指针。

    【讨论】:

      【解决方案3】:

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

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

      void ** debut = A;
      

      现在它实际上可以添加到debut,因为它知道它指向的值是一个指针,因此可以根据您平台上指针的大小递增。你仍然不能像temp[k] 这样打电话,因为现在tempvoid* 类型,但至少debut[k] 是有效的。

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

      【讨论】:

        【解决方案4】:

        debutvoid * 类型的指针。您不能将[] 运算符与void * 类型的指针一起使用。它在 C 语言中是非法的。这在您的代码中应该是什么意思?

        显然,您的编译器允许您使用 []debut 作为特定于编译器的扩展(这在 C 中仍然是非法的)。但是,debut[k] 的结果是void 类型的“左值”。您无法阅读void。您不能将void 分配给任何东西。那没有任何意义。你试图读取debut[k]的“价值”是想表达什么?


        考虑到您的评论,显然您需要的是 debut 声明为

        void **debut;
        

        注意两个星号。

        同样,如果你想通过一个独立的指针debut访问数组void * A[3]的元素,则指针debut必须声明和初始化如下

        void **debut = A;
        

        这样访问debut[k] 将实际访问A[k]

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

        附:您的循环将无限循环,因为您既不会更改 debut 也不会更改 fin

        【讨论】:

        • 我想首次获取指针的连续值(它在程序执行过程中会发生变化)
        【解决方案5】:

        我不相信你可以索引到 void* 因为编译器怎么知道要跳转多少字节(即索引)。您可能需要先转换,然后再索引。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-24
          • 2018-03-10
          • 1970-01-01
          • 2022-10-08
          • 2021-12-30
          • 1970-01-01
          相关资源
          最近更新 更多