2013-04-12 1 views
-1

나는 C와 끔찍하며 strcpy에 문제가있다. 함수 인수 중 하나를 잡고 char 배열에 저장하려고합니다. 이걸 실행할 때 세분화 오류가 발생하지만 그 이유는 알 수 없습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 감사!strcpy의 문제

struct bb_state { 
    FILE *logfile; 
    char *rootdir; 
}; 

struct bb_state *bb_data; 
bb_data = malloc(sizeof(struct bb_state)); 
strcpy(bb_data->rootdir, argv[argc-2]); 
+1

포인터 ('bb_data-> rootdir')가 가리키는 영역을 확보 할 필요가있다을 할당합니다. – BLUEPIXY

+0

'bb_data-> rootdir'의 크기를 확인 했습니까? 'char * strcpy (char * destination, const char * source)': ** overflows **를 피하기 위해서, ** destination **이 가리키는 배열의 크기는 ** 같은 C 문자열을 포함 할만큼 충분히 길어야한다. 소스 ** (종료 널 문자 포함), 소스와 메모리에서 겹쳐서는 안됩니다. –

답변

2

char* rootdir에 메모리를 할당해야합니다.

:

int len=strlen(argv[argc-2])+1; 
bb_data->rootdir=malloc(len); 

그 후 당신은 할 수 있습니다 :

strcpy(bb_data->rootdir, argv[argc-2]); 
+1

'strdup'을 사용할 수있는 경우 위의 단계를 한 줄에 수행 할 수 있습니다. –

+0

그거야. 감사! – Alex

1

당신은 rootdir을위한 공간을 할당해야합니다. 복사하려고 얼마나 많은 문자를 추정하면 rootdir 또 다른 malloc을 수행 할 수 있습니다

확실히 argvargc-2를 사용하여 인덱싱 할 수있을만큼 큰합니다. 이것은 또한 충돌을 일으킬 수 있습니다.

bb_data->rootdir = malloc(strlen(argv[argc-2]+1)); 
1

나는 함수 인수 중 하나와 문자 배열에서 저장을 잡기 위해 노력하고있어.

코드의 문제는 복사 된 인수를 저장할 문자 배열이 없다는 것입니다. 당신이 가지고있는 것은 포인터입니다. 인수를 복사 할 저장 영역을 할당해야합니다. 또는 rootdir을 포인터 대신 배열로 만들 수 있지만 고정 크기 배열이 오버플로되지 않도록주의해야합니다.

저장을

bb_data->rootdir = malloc(strlen(argv[argc - 2]) + 1); // +1 is for the NULL 

만들기 ROOTDIR 배열

#include <limits.h> 
#include <stddef.h> 
#include <stdlib.h> 

... 

    struct bb_state { 
     FILE *logfile; 
     char rootdir [PATH_MAX]; 
    }; 

    struct bb_state *bb_data; 
    size_t   len; 
    len = strlen(argv[argc - 2]); 
    if (len >= PATH_MAX) { 
     // Argument is too long. 
     fprintf(stderr, "Argument is too long: %s\n", argv[argc - 2]); 
     return EXIT_FAILURE; 
    } 
    bb_data = malloc(sizeof(struct bb_state)); 
    strcpy(bb_data->rootdir, argv[argc - 2]);