在C中修改链接列表

时间:2013-09-07 09:43:47

标签: c singly-linked-list

我想更改链接列表中的值。该列表定义为

struct car_elements {
    char *car_rego;
    double time_parked;
    struct car_elements *next;
};

typedef struct car_elements car;

我创建了一个包含10个元素的链表。我可以轻松更改time_parked但无法更新char * car_rego。创建字符串

char *rego_array = malloc(7*sizeof(char));
CreateCarRego(rego_array);

CreateCarRego的定义是

void *CreateCarRego(char *rego_array)
{
    int temp = 0;
    for (int w = 0; w < 6; w++)
    {
        if (w < 3)
        {
            temp = GenerateRandomNumber(26.0);
            temp = temp + ASC_TO_LETTER;
            rego_array[w] = (char)temp;
        }
        else
        {
            temp = GenerateRandomNumber(10.0);
            temp = temp + ASC_TO_NUMBER;
            rego_array[w] = (char)temp;
        }
        rego_array[7] = '\0';
    }
}

然后更改值

car *current_carpark = head; //head holds the linked list

for (int i = 1; i < carspace_number; i++) {  //I know which element I want to change
    current_carpark = current_carpark->next;
}

current_carpark->car_rego = (char*)calloc(strlen(rego_array), sizeof(char));
strncpy(current_carpark->car_rego, rego_array, strlen(rego_array));

这有效但现在我有内存泄漏 - 我无法释放current_carpark。使用结构定义,我有什么是创建字符串的最佳方法(只有3个随机字母和3个随机数)并更新car_rego。我不能只使用

current_carpark->car_rego = rego_array; 

因为没有存储。我是C的新手,是的,这是一项任务,但我已经尝试过并试图让这项工作没有成功

1 个答案:

答案 0 :(得分:1)

代码超出范围char * 问题。


CreateCarRego()中,更改

rego_array[7] = '\0';

rego_array[6] = '\0';

将NUL终结器打开是好的,但它是在错误的地方完成的。 rego_array长度为7个字节,第7个字节通过rego_array[6]访问。


更改

current_carpark->car_rego = (char*)calloc(strlen(rego_array), sizeof(char));
strncpy(current_carpark->car_rego, rego_array, strlen(rego_array));

current_carpark->car_rego = malloc(strlen(rego_array) + 1);
strcpy(current_carpark->car_rego, rego_array);

仅使用字符串的长度分配的内存不足,需要字符串+ 1的长度。以下strncpy()限制太紧,它也应该是strlen(rego_array) + 1。众所周知,脱水时间足够长,可以使用strcpy()

使用

简化字符串重复
current_carpark->car_rego = strdup(rego_array);

也可以提到一些改进,但上面应该摆脱记忆问题。