2011-07-27 3 views
0

누군가가 왜 내게 설명 할 수 있습니다 배열 배열 크기가 비어있는 경우,이왜이 char 배열 Seg 오류가 발생합니까?

char str1[] = "Hello"; 

프로그램이 seg 오류가 있지만이 지정되어있는 경우

char str1[10] = "Hello"; 

그것은 잘 작동합니다.

다음은 전체 프로그램입니다.

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

char concat_string(char str[], char str2[], char destination[], unsigned int bufferSize); 

int main(int argc, char *argv[]) 
{ 
    unsigned int bufferSize = 64; 
    // Both str1 and str2 must be defined 
    // or else the program will seg fault. 
    char str1[] = "Hello "; 
    char str2[] = "World"; 
    char concatenatedString[bufferSize]; 

    concat_string(str1,str2,concatenatedString,bufferSize); 

    printf("The concatenated string is: \n%s\n", concatenatedString); 
    return 0; 
} 


char concat_string(char str[], char str2[], char destination[], unsigned int bufferSize) 
{ 
    char buffer[bufferSize]; 
    strncat(str, str2, bufferSize); 
    strncpy(buffer,str, bufferSize); 
    strncpy(destination,buffer,bufferSize); 
    return *destination; 
} 

답변

7

전체 프로그램을 수 있습니다 :

strncat(str, str2, bufferSize); 

귀하의 str 만이 일곱 바이트과 공간 str2을 추가하기 전에 이미 가득 찼습니다. 이와 운이 있어요 :

char str1[10] = "Hello"; 

당신은 아직도 그것을 "World"를 추가 할당 공간이 충분하지 않는; str1의이 버전에서 후행 공백이 누락되었지만 segfault와 관련이 없습니다. concat_stringstr을 직접 destination에 복사 한 다음 str2destination에 추가해야합니다. 이것은 또한 strstr2 인수를 변경하는 것을 피할 것이고 이것은 더 정중 할 것입니다; strstr1 배열의 크기를 전달하지 않으므로 아무 것도 추가 할 여지가 있는지 알 수 없습니다.

+1

예. 나는 바보 야. 그건 완벽하게 이해가됩니다. – FrozenWasteland

+0

@FrozenWasteland : 우리 모두 바보로 시작합니다. mistaek을 만들고, 수업을 배우고, 헹구고, 반복하십시오. –

관련 문제