需要C结构解引用Lvalue

时间:2014-09-03 10:02:44

标签: c dereference

我目前在borland C编码,我遇到了结构解除引用的问题。  current-> value = x;给出左值所需的错误。这不会发生在" value"是char。无论如何都要将x的值赋给current-> value?

#include<stdio.h>
#include<conio.h>

char x[16];
FILE *fin;

struct node {
    char value[16];
    struct node *next,*prev;
};
struct node *current;

void main(){
    fin = fopen("tokens.ctr","r");
    current = (struct node*) malloc(sizeof(struct node));
    fscanf(fin,"%s",&x);
    current->value = x; 
}

3 个答案:

答案 0 :(得分:3)

简而言之,因为c不允许你复制那样的数组。你必须复制数组的每个元素,或者使用循环或使用memcpy ot strcpy

顺便说一句,

  • 没有理由在这样的文件范围内声明x和fin。您应该最小化变量的范围。
  • main必须返回int,而不是void
  • 不要从malloc投出回报。它返回void *,可以将其分配给任何其他指针类型。
  • 如果任何令牌为16个字符或更多
  • ,则您的fscanf来电可能会导致未定义的行为

答案 1 :(得分:2)

你的主要是错的:

void main(){
  fin = fopen("tokens.ctr","r");
  current = (struct node*) malloc(sizeof(struct node));
  fscanf(fin,"%s",&current->value);
  // current->value = x;  <-- this was wrong too, read the comments:)
}

你应该记住,你最多可以阅读15个字符(+ \ 0)。 %s会尽可能多地阅读。您应该使用%15s或其他功能,例如freadfgets

编辑:使用fgetsstrncpy,关闭流和内存:

void main(){
  FILE* fin = fopen("tokens.ctr","r");
  if (NULL != fin) {
    struct node* current = (struct node*) malloc(sizeof(struct node));
    if (NULL != current) {
      char x[16];
      fgets(x, sizeof(x), fin); // fread(fin, 
      strncpy(current->value, x, sizeof(current->value)); 
      free(current);
    }
    fclose(fin);
  }
}
  1. 无需为看起来像本地变量
  2. 的东西声明全局变量
  3. 变量在需要的地方进行初始化(可能不适用于所有C标准,但应该与--std=c99一起使用)
  4. fgets fin 中读取的内容最多小于 sizeof(x)个字符。您不必维持%15sx的大小之间的关系。
  5. strncpy最多从sizeof(current->value) x复制current->value
  6. 我不知道这是不是一个简单的样本,但永远不要忘记释放你不再需要它时使用的资源。

答案 2 :(得分:0)

fscanf(fin,"%s",&x);
current->value = x; 

应该是:

fscanf(fin, "%s", x);
strcpy(current->value, x); 

或:

fscanf(fin, "%s", current->value);