포인터를 이해하고 역 문자열 함수를 만들려고합니다.
암호:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *reverseString(char string[]){
int i;
int len = strlen(string);
char reversedString[len];
for (i = 0; i < len; i++){
reversedString[i] = string[(len - 1) - i];
}
printf("%s", reversedString); //print it out
return reversedString; //return pointer to first element of reversed string
}
int main (){
char string[6] = "kitten";
int i;
char *p = reverseString(string);
return (0);
}
내 목표는 문자열 "kitten"을 뒤집어 뒤집은 문자열을 인쇄하는 것입니다. 출력 "nettik"을 기대하지만 "nettik ..."을 얻습니다. 이 이상한 캐릭터가 나오는 이유는 무엇입니까?
중지! 우선, 초보자가 포인터에 대해 배울 때 자주 범하는 고전적인 실수를하고 있습니다. 당신이 쓸 때 :
char *reverseString(char string[]) {
...
char reversedString[len];
return reversedString;
}
당신은 그것이 있던 위치에 대한 포인터를 반환하고 있습니다 : 당신이 함수를 떠날 때 메모리가 실제로 해제되므로 반전 된 문자열이 포함되어 있다고 생각하는 메모리가 이미 다른 것에서 재사용되지 않는다는 보장은 없습니다. 이렇게하면 프로그램이 치명적으로 실패합니다.
그러나 반환하기 전에 반전 된 문자열을 인쇄하므로 아직 큰 문제가 아닙니다 . 그렇다면 여기서 잘못된 것은 문자열이 제대로 0으로 끝나지 않는다는 것입니다.
C 언어의 문자열은 최종 '\0'
바이트 를 저장할 공간이 필요 char string[6] = "kitten";
합니다 { 'k', 'i', 't', 't', 'e', 'n', '\0' }
. 0으로 끝나는 문자열을 보유하기에 너무 작습니다 . 마찬가지로를 호출 할 때를 사용 printf("%s", reversedString)
하여 문자열을 제대로 종료하지 않았 '\0'
으므로 문자열 printf
의 끝을 계속 찾고 reversedString
할당 된 메모리에있는 정크를 출력합니다 .
다음을 시도해야합니다.
void
,7
원래 문자열에 바이트 할당 ,strlen(string) + 1
새 문자열에 대해 (또한 7) 바이트 할당'\0'
이전 문자열을 반대로 반복 한 후 새 문자열 끝에 a 를 씁니다 .이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다