我想在循环中填充结构列表,但似乎只用对所使用结构的最后引用来填充它。
这是我实现列表的方式:
typedef struct message_r{
struct timeval timestamp_s;
char g;
int x;
struct timeval timestamp_a;
}message_r;
typedef struct node {
message_r* val;
struct node * next;
} node_t;
node_t* inizialize_list(message_r* value){
node_t * head = NULL;
head = (node_t *) malloc(sizeof(node_t));
if (head == NULL) {
return (node_t *)1;
}
head->val = value;
head->next = NULL;
return head;
}
void push(node_t * head, message_r* val) {
node_t * current = head;
while (current->next != NULL) {
current = current->next;
}
current->next = (node_t *) malloc(sizeof(node_t));
current->next->val = val;
current->next->next = NULL;
}
void print_list(node_t * head) {
node_t * current = head;
while (current != NULL) {
printf("msg: x:%d g:%c\n", current->val->x, current->val->g);
current = current->next;
}
}
这是我用于测试的主要内容:
#include "list.h"
int main(int argc, char* argv[]){
message_r m;
m.x = -1;
m.g = '0';
gettimeofday(&m.timestamp_s, NULL);
gettimeofday(&m.timestamp_a, NULL);
node_t* head = inizialize_list(&m);
for(int i = 0; i< 10; i++){
message_r m1;
m1.x = i;
m1.g ='g';
gettimeofday(m1.timestamp_s, NULL);
gettimeofday(m1.timestamp_a, NULL);
push(head, &m1);
}
message_r m2;
m2.x = 2;
m2.g ='r';
gettimeofday(&m2.timestamp_s, NULL);
gettimeofday(&m2.timestamp_a, NULL);
push(head, &m2);
print_list(head);
}
我的预期结果是:
msg: x:-1 g:0
msg: x:0 g:g
msg: x:1 g:g
msg: x:2 g:g
msg: x:3 g:g
msg: x:4 g:g
msg: x:5 g:g
msg: x:6 g:g
msg: x:7 g:g
msg: x:8 g:g
msg: x:9 g:g
msg: x:2 g:r
但是我得到了
msg: x:-1 g:0
msg: x:9 g:g
msg: x:9 g:g
msg: x:9 g:g
msg: x:9 g:g
msg: x:9 g:g
msg: x:9 g:g
msg: x:9 g:g
msg: x:9 g:g
msg: x:9 g:g
msg: x:9 g:g
msg: x:2 g:r
我认为指针存在问题,但是我无法弄清楚。我该怎么解决?