2016-10-18 1 views
0

"두 문자열 문자열에 대한 포인터를 반환합니다. 첫 번째 문자열은 짝수 인덱스 인 문자열 이고 두 번째 문자열은잘못된 C 실습이 잘못되었습니다 : 두 문자열 배열에 대한 포인터를 반환하려고 시도합니다

char **parity_strings(const char *s) { 

char** parity = malloc(sizeof(char*) * 2); 
char even_strings[] = ""; 
char odd_strings[] = ""; 
int x = 0; 
int y = 0; 

for (int i = 0; i < strlen(s); i++) { 

    if ((i % 2) == 0) { 

     even_strings[x] = s[i]; 
     x++; 
    } 
    else { 
     odd_strings[y] = s[i]; 
     y++; 
    } 
} 

parity[0] = even_strings; 
parity[1] = odd_strings; 



return parity; 

} 

int main(int argc, char **argv) { 
    char **r = parity_strings(argv[1]); 
    printf("%s %s %s", r[0], r[1], argv[1]); 
    return 0; 
} 

내 논리가 말이되지만 출력은 항상 잘못 홀수 지수 "에 있습니다 s의 문자. 예를 들어, 입력 ababab으로 돌아가면 ababab이 반환되고 예상 출력은 aaa bbb ababab입니다. 나는 무엇을 잘못 했는가?

+1

'char even_strings [] = ""; '길이는 1 - 종결 자입니다. 그래서 indexing'even_strings [x] = s [i];는 UB이므로 수명이 다한 로컬 문자열에 대한 포인터를 반환합니다. –

+0

C가 문자열을 다시 처리하는 방법을 검토하는 것이 좋습니다. 이것들은 하이 레벨 오브젝트가 아니고 대신에 ASCII 코드로 채워진'char' 배열과 끝 부분에'nul' 제로입니다. 적분 치로서 사용할 수있는 것이 아닙니다. (비록 문자열에 포인터, 당신은 할 수) – infixed

답변

2

even_strings이라는 문자열은 지역 변수이므로 함수가 반환 된 후 메모리가 해제되므로 호출자에게 포인터를 반환하려고 시도하는 것은 유효하지 않습니다. 이 라인을 변경

보십시오 :이 같은 뭔가를

char even_strings[] = ""; 

는 :

char * even_strings = malloc(some_size); 

같은 당신의 odd_strings 문자열을 간다.

또한 프로그램이 각 문자열에 충분한 메모리를 할당하여 쓸 데이터를 모두 저장할 수 있도록 some_size 값을 선택하십시오.

+0

고마워요! 매우 도움이됩니다. – TimelordViktorious

2

even_stringsodd_strings은 각각 크기 1의 어레이입니다. 코드가 범위를 벗어나 씁니다 (even_strings[x] = s[i], odd_strings[y] = s[i]). 또한, 그들은 parity_strings이 돌아 오면 사라지는 지역 변수이므로 반환 된 포인터는 가비지입니다.

관련 문제