1

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

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 新手,是的,这是一项任务,但是我已经尝试并试图让它工作但没有成功

4

1 回答 1

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。众所周知,destniation 足够长,strcpy()可以使用。

或者

简化字符串重复

current_carpark->car_rego = strdup(rego_array);

还可以提到一些改进,但以上应该消除记忆问题。

于 2013-09-09T18:32:40.723 回答