这是链表和结构:
#define MAX_PATH_SIZE (256)
#define MAX_NAME_SIZE (50)
struct Frame
{
char *name;
unsigned int duration;
char *path; // may change to FILE*
};
typedef struct Frame frame_t;
struct Link
{
frame_t *frame;
struct Link *next;
};
typedef struct Link link_t;
这是我的功能:
link_t* createFrame(char name[], int duration, char path[]){
frame_t * temp = (frame_t*)malloc(sizeof(frame_t));
temp->duration = duration;
strncpy(temp->name, name,MAX_NAME_SIZE);
strncpy(temp->path, path,MAX_PATH_SIZE);
link_t* newFrame = (link_t*)malloc(sizeof(link_t));
newFrame->frame = temp;
return newFrame;
}
问题是该功能在行" strncpy(temp-> name)中停止工作..",奇怪的是temp->持续时间正在工作但它没有&# 39;使用字符串。错误:" 0x0F744645处于未处理的异常(msvcr120d.dll)"
答案 0 :(得分:2)
您没有为您的名称分配内存,现在它们指向未知位置并且是未定义的行为。
temp->name = malloc((MAX_NAME_SIZE + 1) * sizeof(*temp->name));
temp->path = malloc((MAX_PATH_SIZE + 1) * sizeof(*temp->path));
temp->name[MAX_NAME_SIZE] = 0; //Manually add null termination
temp->name[MAX_PATH_SIZE] = 0; //Manually add null termination
strncpy(temp->name, name,MAX_NAME_SIZE);
现在,为名称和路径分配了内存,您可以复制名称和路径的数据。
或者,如果需要,您可以像这样定义结构:
struct Frame {
char name[MAX_NAME_SIZE + 1];
unsigned int duration;
char path[MAX_PATH_SIZE + 1];
};
然后您不需要单独调用malloc
作为名称和路径,因为内存将在结构的第一个malloc
上分配。
答案 1 :(得分:0)
你需要分配内存以使用strncpy()来存储字符串,在malloc中你只分配了足够的内容来存储sizeof(struct Frame)字节。
你可能想尝试这个而不是strncpy ......
temp->name = strndup(name, MAX_NAME_SIZE);
temp->path = strndup(path,MAX_PATH_SIZE);
...如果您坚持要限制字符串的最大大小。
答案 2 :(得分:0)
试试这个:
#define MAX_PATH_SIZE (256)
#define MAX_NAME_SIZE (50)
struct Frame
{
char name[MAX_NAME_SIZE];
unsigned int duration;
char path[MAX_PATH_SIZE]; // may change to FILE*
};
typedef struct Frame frame_t;
struct Link
{
frame_t *frame;
struct Link *next;
};
typedef struct Link link_t;
link_t* createFrame(char name[MAX_NAME_SIZE], int duration, char path[MAX_PATH_SIZE]){
frame_t * temp = (frame_t*)malloc(sizeof(frame_t));
temp->duration = duration;
strncpy(temp->name, name, MAX_NAME_SIZE);
strncpy(temp->path, path, MAX_PATH_SIZE);
link_t* newFrame = (link_t*)malloc(sizeof(link_t));
newFrame->frame = temp;
return newFrame;
}