2014-10-08 5 views
-2

명령 줄 인수를 문자열로 연결하려고합니다. 처음에는 문자열을 선언하기 위해 문자 유형의 포인터를 사용했습니다.C의 세그먼트 오류. 명령 줄 인수를 연결하려고 시도했습니다.

char *str; 
    strcpy(str, argv[1]); 
    int i = 2; 
    while(i < argc) { 
     realloc(str, sizeof(str) + sizeof(argv[i]) + 1); 
     str = strcat(str,argv[i]); 
     i+=1; 
    } 
printf("%s", str); 
free(str); 

위에서 볼 수 있듯이 새로운 메모리를 연결하기 위해 메모리 블록을 재 할당하고 있습니다. 위의 문자 포인터에 할당하지 (11)

+0

'sizeof (str)'은 여러분이 생각하는대로하지 않습니다. 플랫폼에 따라 보통 8 또는 4가됩니다. 'sizeof (argv [i])'는 같은 것이다. –

+0

그 외에도 첫 번째'strcpy()'(루프 앞에 있음)는 이미 초기화되지 않은 포인터를 사용하여 데이터를 복사하려고합니다. – mfro

답변

1
char *str; 

해야한다고 생각 .I. 일반적으로 포인터로 메모리 위치를 지정할 수는 있지만 포인터 자체에 저장 메모리가 없기 때문에 데이터를 복사 할 수는 없습니다.

먼저 메모리 할당해야합니다 :

str = (char *)malloc (sizeof(argv[1]) * sizeof(char)); 

을 아니면 다음 대신 문자 버퍼를 할당 할 수는 strcpy를 :

두 번째 경우
char str[MAX_STR_LENGTH] = {0}; 
strcpy (str, argv[1]); 

, STR도에 대한 포인터입니다 str [0] 따라서 str char 버퍼의 첫 번째 요소.

1
char *str; 

메모리 strcpy 전에 .Use malloc/calloc 메모리를 할당 :하지만 분할 오류를 얻을.

또한 sizeof은 플랫폼에 따라 8 또는 4 바이트이기 때문에 sizeof을 사용할 수 없습니다.

또한 sizeof(argv[i]) + 1 것이이 단지 포인터를 생성 strlen(argv[i]) + 1