【发布时间】:2019-10-30 07:34:39
【问题描述】:
我的任务是将一些输入复制到链接列表,但是当我尝试使用 strncpy 复制它时,它不起作用并且出现错误
Exception thrown at 0x0F4C0E15 (ucrtbased.dll) in
ProjectA.exe: 0xC0000005: Access violation writing location 0xCDCDCDCD.
代码:
typedef struct Frame
{
char* name;
unsigned int duration;
char* path;
} Frame;
typedef struct FrameNode
{
Frame* frame;
struct FrameNode* next;
} FrameNode;
FrameNode* createframe(char name[], char path[], int duration)
{
Frame* list = (Frame*)malloc(sizeof(Frame));
strncpy((list->name), name, STR_LEN);
list->duration = duration;
strncpy(list->path, path, STR_LEN);
FrameNode* frame = list;
frame->next = NULL;
return list;
}
【问题讨论】:
-
malloc()之后,list->name是一个未初始化的指针。您需要为字符串分配足够的空间,然后复制到该空间中。与path类似。不要忘记在字符串末尾允许空字节。 -
你可以用代码告诉我吗?我不明白你提供给我什么
-
malloc(sizeof(Frame));为Frame分配存储空间,但它不会为要存储在组件name和path中的字符串分配存储空间。请注意,这些是指针而不是数组。因此,strncpy((list->name), name, STR_LEN);是 U.B.您既没有初始化组件list->name,也没有为复制到其中的数据分配存储空间。list->path也是如此。 -
一种解决方案可能是将
Frame更改为struct Frame { char name[STR_LEN]; unsigned int duration; char path[STR_LEN]; };,假设STR_LEN表示足够的常数。另一种解决方案是使用malloc(STR_LEN)初始化list->name和list->path。
标签: c string memory-management linked-list singly-linked-list