分配给具有数组类型的表达式并请求非结构或联合中的成员[关闭]

Posted

技术标签:

【中文标题】分配给具有数组类型的表达式并请求非结构或联合中的成员[关闭]【英文标题】:Assignment to expression with array type AND request for member in something not a structure or union [closed] 【发布时间】:2019-11-11 18:26:25 【问题描述】:

我试图声明我的结构类型的这个变量并且有这个错误,代码是关于选举的。 CANDIDATO 是葡萄牙语单词,意思是候选人,我想我不需要翻译这么多

struct candidatos
    int  numCandidato;
    char nomeCandidado[10];
    char partidoCandidato[3];
    char cargoCandidato[1];
     int votos;
    float porcentagem;
;
struct candidatos listar[11];

int main()
    //CANDIDATO 01
    listar[0].numCandidato = 111;
    strcpy(listar[0].nomeCandidado, "ABC");
    strcpy(listar[0].partidoCandidato, "ABC");
    strcpy(listar[0].cargoCandidato, "ABC");
    listar[0].votos = 0;


////ERROR START'S HERE


int iniciarVotacao()

    struct candidatos presidente; 
    struct candidatos deputado;
    int votoPresidente = 0;
    int votoDeputado = 0;
    int i = 0;

    presidente.nomeCandidado = 0; //°1 erro
    deputado.numCandidato = 0; // erro

    printf("Número do candidato para a Presidência => ");
    scanf("%d", &votoPresidente);
    printf("\nNúmero do candidato para Deputado => ");
    scanf("%d", &votoDeputado);

    for(i = 0 ; i < 11 ; i++)
            if(listar[i].numCandidato == votoPresidente && listar.numCandidato < 50)
                presidente = listar[i];
            // 2° erro acontece
            if(listar[i].numCandidato == votoPresidente && listar.numCandidato > 1000)
                deputado = listar[i];
            
    

【问题讨论】:

同样listar.numCandidato应该是listar[i].numCandidato strcpy() 中的一些调用 main() 遭受缓冲区溢出。 strcpy(listar[0].partidoCandidato, "ABC");strcpy(listar[0].cargoCandidato, "ABC"); 将覆盖 partidoCandidatocargoCandidato 数组成员的 4 个元素(包括字符串的空终止符),但数组成员分别只有 3 个和 1 个元素长。 【参考方案1】:

我已经纠正了与您有关的错误。以下是修正版:

#include <stdio.h>
#include <string.h>

struct candidatos
  int  numCandidato;
  char nomeCandidado[10];
  char partidoCandidato[4];
  char cargoCandidato[4];
  int votos;
  float porcentagem;
 listar[11];

int main()
  //CANDIDATO 01
  listar[0].numCandidato = 111;
  strcpy(listar[0].nomeCandidado, "ABC");
  strcpy(listar[0].partidoCandidato, "ABC");
  strcpy(listar[0].cargoCandidato, "ABC");
  listar[0].votos = 0;


int iniciarVotacao()
  struct candidatos presidente;
  struct candidatos deputado;

  int votoPresidente = 0;
  int votoDeputado = 0;
  int i = 0;

  presidente.nomeCandidado[0] = '0';
  deputado.numCandidato = 0;

  printf("Número do candidato para a Presidência => ");
  scanf("%d", &votoPresidente);
  printf("\nNúmero do candidato para Deputado => ");
  scanf("%d", &votoDeputado);

  for(i = 0 ; i < 11 ; i++)
    if(listar[i].numCandidato == votoPresidente && listar[i].numCandidato < 50)
      presidente = listar[i];
    // 2° erro acontece
    if(listar[i].numCandidato == votoPresidente && listar[i].numCandidato > 1000)
      deputado = listar[i];
    
  

presidente.nomeCandidado = 0; 的第一个错误是因为您试图将整数值分配给数组指针。你必须事先索引你的数组。

listar 是一个结构数组,根据您的代码listar[i].numCandidato。您不能在稍后阶段将其仅视为结构,而不是结构数组。正如您在 for 循环中所做的那样,listar.numCandidato。这也必须改变。

您在 candidatos 结构定义中分别为 partidoCandidatocargoCandidato 声明了 3 个和 1 个索引也犯了一个错误。它们必须至少为 4,因为您要为它们分配 ABC。其中包含 3 个字符和一个为空终止符 \0 保留的额外字符,表示数组的结束。

作为旁注。由于您在全局声明了listar[11],因此在定义它使用的结构之后。为什么不直接在candidatos 结构的右方括号之后声明它,而不是写一个全新的行?正如我在上面所做的那样。

【讨论】:

以上是关于分配给具有数组类型的表达式并请求非结构或联合中的成员[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

编译错误:请求非结构或联合中的成员

CoreData 和访问关系的问题:请求非结构或联合中的成员

“错误:分配给带有数组类型错误的表达式”当我分配结构字段时(C)

在非结构或联合的情况下请求成员 tableView

编译时在非结构或联合中获取成员“indexPath”的错误请求

UNNEST 数组并使用 CASE WHEN 分配给新列