使用链表+结构C

时间:2017-06-08 16:24:58

标签: c struct linked-list

这是链表和结构:

#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)"

3 个答案:

答案 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;
}