문자 간의 차이 *str="STRING"과 charstr[] = "STRING"?
문자열에서 특정 문자를 제거하는 간단한 함수를 코드화하는 과정에서 이상한 문제가 발생했습니다.
void str_remove_chars( char *str, char to_remove)
{
if(str && to_remove)
{
char *ptr = str;
char *cur = str;
while(*ptr != '\0')
{
if(*ptr != to_remove)
{
if(ptr != cur)
{
cur[0] = ptr[0];
}
cur++;
}
ptr++;
}
cur[0] = '\0';
}
}
int main()
{
setbuf(stdout, NULL);
{
char test[] = "string test"; // stack allocation?
printf("Test: %s\n", test);
str_remove_chars(test, ' '); // works
printf("After: %s\n",test);
}
{
char *test = "string test"; // non-writable?
printf("Test: %s\n", test);
str_remove_chars(test, ' '); // crash!!
printf("After: %s\n",test);
}
return 0;
}
제가 이해하지 못하는 것은 두 번째 시험이 왜 실패하느냐는 것입니다.제가 보기엔 첫 번째 표기처럼 보입니다.char *ptr = "string";
는 다음과 같습니다.char ptr[] = "string";
.
그렇지 않습니까?
그 두 선언은 같지 않습니다.
char ptr[] = "string";
크기의 문자 배열을 선언합니다.7
그리고 그것을 문자들로 초기화 합니다.
s
,t
,r
,i
,n
,g
그리고.\0
. 이 배열의 내용을 수정할 수 있습니다.
char *ptr = "string";
선언합니다ptr
문자 포인터로서 문자열 리터럴 주소로 초기화합니다. "string"
읽기 전용입니다.문자열 리터럴을 수정하는 것은 정의되지 않은 동작입니다.당신이 본 것(예: seg fault)은 정의되지 않은 행동을 보여주는 하나의 표현입니다.
엄밀하게 말하면 다음과 같은 선언을 합니다.char *ptr
는 문자 유형에 대한 포인터만 보장합니다.문자열이 일부 운영 체제에서 읽기 전용으로 설정되는 컴파일된 응용 프로그램의 코드 세그먼트의 일부를 형성하는 것은 드문 일이 아닙니다.문제는 사전 정의된 문자열의 본질에 대해 가정을 하고 있다는 것입니다(쓰기 가능하다는 것). 실제로 해당 문자열에 대한 메모리를 직접 명시적으로 생성한 적이 없습니다.컴파일러 및 운영 체제의 일부 구현을 통해 시도한 작업을 수행할 수 있습니다.
다른 한편으로는 다음과 같은 선언.char test[]
, 정의에 따라 실제로 스택의 전체 문자 배열에 대해 읽고 쓸 수 있는 메모리를 할당합니다.
내 기억으로는
char ptr[] = "string";
복사본을 만듭니다."string"
스택 위에 있어요, 그럼 이건 변형이 가능한 거죠.
폼
char *ptr = "string";
에 대한 하위 호환성입니다.
const char *ptr = "string";
그리고 사용자는 (정의되지 않은 동작의 관점에서) 그 내용을 수정할 수 없습니다.컴파일러는 이러한 문자열을 메모리의 읽기 전용 섹션에 배치할 수 있습니다.
char *test = "string test";
잘못했어요, 그랬어야 했어요.const char*
. 이 코드는 하위 호환성 이유 때문에 컴파일됩니다.가 가리키는 기억은const char*
는 읽기 전용 메모리이며 쓰기를 시도할 때마다 정의되지 않은 동작을 호출합니다.반면에char test[] = "string test"
스택에 쓰기 가능 문자 배열을 만듭니다.이는 쓸 수 있는 다른 정규 지역 변수와 마찬가지입니다.
좋은 답변 @codaddict.
a.sizeof(ptr)
다른 선언에 대해 다른 결과를 제공할 것입니다.
첫 번째 것인 배열 선언은 종단 null 문자를 포함한 배열의 길이를 반환합니다.
는.char* ptr = "a long text...";
일반적으로 4 또는 8인 포인터의 길이를 반환합니다.
char *str = strdup("test");
str[0] = 'r';
는 적절한 코드이며 가변 가능한 문자열을 만듭니다. str은 힙의 메모리에 'test' 값을 채웁니다.
언급URL : https://stackoverflow.com/questions/3862842/difference-between-char-str-string-and-char-str-string
'programing' 카테고리의 다른 글
인라인 스타일이 있는 CSS 유사 클래스 (0) | 2023.09.27 |
---|---|
XSD 파일의 목적은 무엇입니까? (0) | 2023.09.27 |
관계형 데이터베이스에서 상속 모델링을 수행하는 방법은? (0) | 2023.09.27 |
명명된 문자 벡터를 data.frame으로 변환 (0) | 2023.09.27 |
MySQL에서 연결 시간대 변경 (0) | 2023.09.27 |