2013-05-23 5 views
1

세그먼트를 잘못 실행하면 어떻게됩니까 ??번호 인쇄 프로그램의 세그먼트 오류

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

static char* exe; 

void usage(void) { 
    printf("Usage: %s <number of integers>\n", exe); 
} 

int main(int argc, char** argv) { 
    //This program reads in n integers and outputs them/ 
    //in reverse order. However, for some odd reason, I/ 
    //am getting an error when I run it with no command/ 
    //line arguments. It is supposed to display helpful/ 
    //usage information out, but instead it segfaults??/ 
    exe = malloc(50 * sizeof(*exe)); 
    strncpy(exe, argv[0], 49); 

    if(argc != 2) { 
     usage(); 
     exit(0); 
    } 

    int n = atoi(argv[1]); 
    int* numbers = malloc(n * sizeof(*numbers)); 

    int i; 
    for(i = 0; i < n; i++) { 
     scanf("%d\n", &numbers[i]); 
    } 

    for(i = 9; i >= 0; i--) { 
     printf("%d:\t%d\n", 10 - i, numbers[i]); 
    } 

    free(numbers); 
    free(exe); 
    return 0; 
} 
+0

디버거에서 segfault가 발생하는 위치는 어디입니까? 이 프로그램에 어떤 인풋을 제공합니까? – templatetypedef

+0

'strncpy' 라인은 segfault를 발생시킵니다. 나는'./numbers 10'와 같은 것을 실행하고 있습니다. – C0deH4cker

+0

가능한 복제본은 무엇입니까? operator do ?!] (http://stackoverflow.com/questions/7825055/what-does-the-c-operator-do) –

답변

6

??/는 주석의 일부로 전환하기 위해 exe = malloc... 라인을 일으키는 원인이 \로 밝혀 졌의 trigraph입니다 때문입니다. 따라서 exe은 여전히 ​​NULL이며, 역 참조 할 때 충돌이 발생합니다.

+0

+1 음, 와우. 나는 이것이 합법적 인 질문인지, 아니면 우리가 그냥 잡히고 있는지 알 수 없다. – templatetypedef

+0

내 돈은 OP에서 특별히 언급 된 다른 trigraph 질문을 읽은 것입니다. –

+0

정말로 좋은 사람. 완전히 trigraph를 놓친. –

0

변수 argv[0]는 실행중인 프로그램의 이름에 대한 포인터를 보유하고 있습니다. 프로그램이이 포인터에서 시작하는 49 개의 문자 또는 NULL 중 먼저 오는 것을 읽으려고합니다. 귀하의 경우, 귀하는 액세스 권한이없는 새로운 페이지로 이동할 것입니다.

+0

아니요, argv [1]이 아니라'argv [0]'입니다. 이것으로 프로그램의 이름입니다. – C0deH4cker

+0

"src의 길이가 n보다 작은 경우 strncpy()는 총 n 바이트가 기록되도록 dest에 추가 null 바이트를 씁니다." – C0deH4cker

0

당신은 당신의 exe 문자열이 당신 strncpy 후 NULL 종결이 있는지 확인해야합니다. strncpy 후이 줄을 추가

시도 :

exe[49] = '\0'; 
+0

'strncpy'는 NULL 종결자를 추가합니다 ... 또한'strncpy' 함수 자체가 segfault를 발생시킵니다. – C0deH4cker

+0

strncpy는 첫 번째'n' (사용자의 경우 49 자)에 하나가있는 경우에만 NULL 종결자를 추가합니다. 그렇지 않으면 그렇지 않습니다. – MatthewD