将 char* 分配给 void* 字段

问题描述 投票:0回答:1

我需要编写一个程序来读取文件行并将它们保存在链接队列中。我正在使用一个在每个节点中使用 void* 数据字段的库。

当我尝试打印存储的所有行时,程序会重复读取的最后一行,以获取文件中存储的行数。

我认为,由于我传递了一个指向数据字段的指针,因此每次读取新行时,存储的值都会发生变化。有办法预防吗?

附上我正在使用的函数以及队列函数和结构。


void* readfile(void* arg){
   FILE* fp;
   fp = fopen((char*)arg, "r");
   if(fp==NULL){
      fprintf(stderr, "Error opening file %s\n", (char*)arg);
      exit(EXIT_FAILURE);
   }

   char* line= malloc(sizeof(char)*BUFSIZE); // #define BUFSIZE 1024

   while(fgets(line, BUFSIZE, fp)!=NULL){
      insert_tail(deque_12, (void*)line);
   }
   puts("File read");
   fclose(fp);
   return NULL; 
}
> deque.h 

typedef struct node{
   void* data;
    struct node *next;
    struct node *prev;
}Node_t;

typedef struct deque{
   Node_t *head;
   Node_t *tail;
}Deque_t;

void insert_tail(Deque_t* d, void* data){

   Node_t *newNode = malloc(sizeof(Node_t*));

   newNode->data = data;
   newNode->next = NULL;

   if(d->head == NULL){
      newNode->prev = NULL;
      d->head = newNode;
   }
   else{
      newNode->prev = d->tail;
      d->tail->next = newNode;
   }
   d->tail = newNode;
}

c linked-list malloc void-pointers
1个回答
0
投票

考虑

readfile
中的这段代码:

    char* line= malloc(sizeof(char)*BUFSIZE); // #define BUFSIZE 1024

   while(fgets(line, BUFSIZE, fp)!=NULL){
      insert_tail(deque_12, (void*)line);
   }

为缓冲区分配一块内存,并将其地址分配给

line
。然后,对于每一行输入,它都会调用
insert_tail
来创建一个指向
line
的新节点。

结果是每个节点都指向同一块内存,即

line
所指向的内存。

要解决这个问题,您必须为每一行的数据分配不同的内存。您可以通过在

readfile
insert_tail
例程中为循环中的每一行分配内存来完成此操作,并在成功分配内存后,将数据从
line
复制到新分配的内存中。那么,当然,新节点的
data
必须设置为指向新分配的内存,而不是指向
line

将 char* 分配给 void* 字段

这与将

char *
值转换为
void *
值无关。

© www.soinside.com 2019 - 2024. All rights reserved.