2016-06-12 3 views
-4

두 번째 이후에 많은 이미지를 실행하기 위해 프로그램을 만들고 싶습니다. 이렇게하려면 이름, 기간 및 경로가 포함 된 구조체 프레임을 만듭니다. 또한 구조체 프레임 포인터와 다음 프레임 포인터를 포함하는 link라는 다른 구조체를 만듭니다.구조체가 연결된 목록의 함수에서 반환 된 결과

그래서 사용자에게 이름, 기간 및 경로를 AddFrame 함수에 삽입하도록 요청합니다. 지금까지 함수 Create_frame은 나에게 이름과 길이를 반환하지만, struct List에 이것을 삽입하려고 할 때 프로그램 충돌로 인해 액세스 위반이 있습니다.

내 코드입니다 :

내 구조체 주에서

struct Link 
{ 
frame_t *frame; 
struct Link *next; 
}; 

typedef struct Link link_t; 

struct Frame 
{ 
char   *name; 
unsigned int duration; 
char   *path; // may change to FILE* 
}; 

typedef struct Frame frame_t; 

있습니다

struct frame_t* CreateFrame(char *name, unsigned int duration, char* path){ 
frame_t* Frame = (frame_t*)malloc(sizeof(frame_t)); 
if (Frame) 
{ 
    Frame->name = (char*)malloc(strlen(name)* sizeof(char) + 1); 
    strcpy(Frame->name, name); 

    Frame->duration = duration; 

    Frame->path = (char*)malloc(strlen(path)* sizeof(char) + 1); 
    strcpy(Frame->path, path); 
} 
else{ 
    return (-1); 
} 

return Frame; 
} 

void AddFrame(link_t** start){ 
unsigned int duration = 0; 
char name[MAX] = { 0 }, path[MAX] = { 0 }; 

link_t* current = NULL; 
current = (link_t*)malloc(sizeof(link_t)); 
current = start; 

if ((*start) == NULL) 
{ 
    printf("Please insert Frame Path: "); fflush(stdin); Myfgets(path, MAX); 
    printf("Please insert frame duration(in miliseconds):"); scanf("%d", &duration); 
    printf("Please choose a name for that frame: "); fflush(stdin); Myfgets(name, MAX); 

    current->frame = CreateFrame(name, duration, path); 
    current->next = NULL; 
} 
else{ 
    while (current->next) 
    { 
     current = current->next; 
    } 
    current->frame = CreateFrame(name, duration, path); 
    current->next = NULL; 
} 

} 

내가 가진 :

link_t* header = NULL; 
AddFrame(&header); 

이 줄 내 프로그램이 다운 : (* 시작) -> 프레임 = CreateFrame (이름, 기간, 경로);

+3

"... 컴파일러가 나에게 말하기를 ..." "내 프로그램이이 줄에서 충돌합니다 ..."- 그래서 무엇입니까? 컴파일러 또는 프로그램이 충돌합니까? 정확하십시오. 좋은 질문을 쓰는 방법에 대해 [ask]를보고 [mcve]를 제공하십시오. – Olaf

+0

그리고'malloc'과 C의 결과를 캐스팅하지 마라! 또한'sizeof (char)'는 ** '**'을 산출하기 위해 ** 정의됩니다. 도움이되는 것보다 쓸모없고 혼란 스럽습니다. – Olaf

+0

'malloc (strlen (name) * sizeof (char) + 1)'은 의미가 없습니다. 여러분이'sizeof (char)'가> 1 일 수 있다고 생각하면'(strlen (name) + 1) * sizeof (char)'가 필요합니다. 또는 문자의 크기가 1이라고 생각하면'sizeof (char)'는 필요 없습니다. – melpomene

답변

1

프레임 -> 이름에 대해 2 바이트 만 할당했습니다!

Frame->name = (char*)malloc(sizeof(char) + 1); 

// 이름은 1 바이트 길이입니까? 경로에 대한

strcpy(Frame->name, name); // this will override the memory 

같은 문제 :

Frame->path = (char*)malloc(sizeof(char) + 1); 
strcpy(Frame->path, path); // this will override the memory 

또한 선 후

if ((*start) == NULL){ // we know that (*start) is equal to NULL 

(*start)->frame = // is equal to (NULL)->frame = 

내가 액세스 위반이 [...]

예, C 언어로 NULL->frame은 언제나 추락 할 것입니다 !!

데이터 변수에 아무 것도 지정하기 전에 NULL이 아닌 (*start)을 생성해야합니다.

+0

대답 해줘서 고마워.하지만 내 문제를 해결하지 못해. 내 편집을보세요 –

+0

@ rony.stackoverflow 당신의 코드는 여전히 여기에 언급 된'NULL-> frame' 버그를 가지고 있습니다. – melpomene

+0

@ rony.stackoverflow 나는 sq7에 동의한다. 당신의 코드에는 많은 정의되지 않은 행동들이있다. 그러한 UB는이 순간에 실패의 효과를 줄 수 있지만 나중에 또한 실패의 효과를 줄 수 있습니다. 이러한 "후기 오류"는 C에 대해 어느 정도까지만 나타납니다. –

0

link_t 개체에 대해 공간을 할당하지 마십시오. NULL 포인터를 찾은 다음 충돌하여 충돌합니다. 충돌합니다. 당신은 당신의 전체 코드가 입력에 매우 변경 내용 만이 경로를 캡처와 함께 당신의 if

+0

내 함수 AddFrame을 편집했습니다. –

0
#include <stdio.h> 
#include <stdlib.h> 

#define MAX 30 

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; 




struct frame_t* CreateFrame(char *name, unsigned int duration, char* path){ 
frame_t* Frame = (frame_t*)malloc(sizeof(frame_t)); 
if (Frame) 
{ 
    Frame->name = (char*)malloc(strlen(name)* sizeof(char) + 1); 
    strcpy(Frame->name, name); 

    Frame->duration = duration; 

    Frame->path = (char*)malloc(strlen(path)* sizeof(char) + 1); 
    strcpy(Frame->path, path); 
} 
else{ 
    return (-1); 
} 

return Frame; 
} 
void AddFrame(link_t** start){ 
unsigned int duration = 0; 
link_t* current = *start; 
char name[MAX] = { 0 }, path[MAX] = { 0 }; 

if ((*start) == NULL) 
{ 
    printf("Please insert Frame Path: "); fflush(stdin); scanf("%s", path); 
    printf("Please insert frame duration(in miliseconds):"); scanf("%d", &duration); 
    printf("Please choose a name for that frame: "); fflush(stdin); scanf("%s", name); 

    (*start)->frame = CreateFrame(name, duration, path); 
    (*start)->next = NULL; 
} 
else{ 
    while (current->next) 
    { 
     current = current->next; 
    } 

    current->next->frame = CreateFrame(name, duration, path); 
    current->next->next = NULL; 
} 

} 



int main(void) { 
    puts("stack overflow program"); /* prints server program */ 

    link_t* header = NULL; 
    AddFrame(&header); 


    return EXIT_SUCCESS; 
} 

위의 두 지점에서

(*start) = malloc(sizeof(link_t)); 

current->next = malloc(sizeof(link_t)); 

같은 라인이 필요합니다 및 이름.

사용하기 전에 (* 시작) -> 프레임 시작을위한 메모리를 할당하지 않았습니다.이는 당신은 당신이 그것에 어떤 리디렉션을 사용하기 전에 *start = malloc(sizeof(link_t));를 추가 할 필요가

ulimit -c unlimited 
    gdb ./yourcode core 

사용하여 디버깅로 이동하여 볼 수 있습니다. 적어도 이것은 적어도 충돌을 일으키지 않을 것입니다.

관련 문제