[英]Working with linked list + struct C
這是鏈接列表和結構:
#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-> duration在起作用,但不適用於字符串。 錯誤:“ 0x0F744645(msvcr120d.dll)出現未處理的異常”
您沒有為您的名字分配內存,現在它們指向未知的位置並且是未定義的行為。
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
上分配了malloc
。
您需要分配內存以使用strncpy()存儲字符串,在malloc中,您分配的內存僅足以存儲sizeof(struct Frame)字節。
您可能要嘗試此方法,而不是strncpy ...
temp->name = strndup(name, MAX_NAME_SIZE);
temp->path = strndup(path,MAX_PATH_SIZE);
...如果您堅持限制字符串的最大大小。
嘗試這個 :
#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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.