2012-05-11 3 views
5

가능한 중복 : 주소 비교 및 ​​문자열 저장


How are string literals compiled in C?

내가 아래 작은 코드를 썼다. 이 코드에서는 첫 번째와 두 번째 "hello"문자열의 주소가 비교 될 것이라고 생각합니다. 나는 이것을 혼란스럽게 생각합니다. 처음에는 두 문자열이 모두 읽기 전용 메모리에 저장되므로 주소가 다를 것이라고 생각했습니다. "equal"은 실행 후에 인쇄됩니다.

objdump를 보았을 때 나는 hello라는 문자열을 볼 수 없었습니다. 나는 변수를 저장하지 않았지만 "hello"가 저장되는 위치는 알았습니다.

스택에 저장됩니까 ?? 또는 코드 세그먼트에 저장됩니까 ??

#include<stdio.h> 
int main() 
{ 
    if ("hello" == "hello") 
     printf("\n equal "); 
    else 
     printf("\n not equal"); 
    return 0; 
} 

if 조건을 if ("hello" == "hell1")으로 변경하면 "같지 않음"이 인쇄됩니다. 다시 말하지만 문자열이 저장되는 위치와 방법. 스택에 저장됩니까 ?? 또는 코드 세그먼트에 저장됩니까 ??

여기 누군가 내가 정교한 답을 주면 정말로 감사 할 것입니다. 감사합니다.

+0

, 당신은 더'해당 if' 전혀 없다는 것을 알 수 있습니다! 최적화 됨! –

+0

[A 기본 질문 : C에서 문자열 리터럴은 어떻게 컴파일됩니까?] (http : //stackoverflow.com/q/6680819/) [http : //stackoverflow.com/q/6680819/] [C에서 "a"! = "a"인 이유는 무엇입니까?] : //stackoverflow.com/q/4843640/), [C 문자열 리터럴 : 그들은 어디로 갈거야?] (0120)을 참조하십시오. – outis

답변

3

특정 예에서 "hello"문자열은 코드의 일부가 아닙니다. 컴파일러는 코드가 언제나 영원히 "평등"으로 인쇄되어 완전히 제거되지 않았 음을 감지 할만큼 똑똑합니다. 그러나

코드가이처럼 보였다 경우 :

#include<stdio.h> 
int main() 
{ 
    const char *h1 = "hello"; 
    const char *h2 = "hello"; 
    if (h1 == h2) 
     printf("\n equal "); 
    else 
     printf("\n not equal"); 
    return 0; 
} 

당신 것 여전히 얻을, "동일한"(추가 최적화없이 컴파일 할 때)에도 불구하고, 그러나, 비교가 실제로 수행됩니다. 최적화였습니다. 컴파일러는 하드 코딩 된 두 개의 동일한 문자열이 있고 결과 바이너리에 병합했다고 감지했습니다.

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

int main() 
{ 
    char *h1 = malloc(sizeof(char) * 10); 
    char *h2 = malloc(sizeof(char) * 10); 

    strcpy(h1, "hello"); 
    strcpy(h2, "hello"); 

    if (h1 == h2) 
     printf("\n equal "); 
    else 
     printf("\n not equal"); 

    free(h1); 
    free(h2); 

    return 0; 
} 
: 코드는이처럼 보였다 경우, 컴파일러는 그들이 같은 걸 (기본적으로) 추측 할 수 없을 것입니다, 당신은 "같지 않음"메시지가 나타납니다 반면

+0

최적화가없는 경우에도 일종의 최적화가 수행됩니다 당신이 보여주는 코드에서. 'h1'과'h2'는 같은 locn을 가리 킵니다. 나는 우리가'O0'에서도 기본적인 최적화에서 컴파일러를 막을 수 없다고 생각합니까? 잘 모르겠지만 –

+0

@ PavanManjunath 나는 그것을 명확하게하기 위해 내 게시물을 재구성했다. –

+0

이것은 주소 비교이기 때문에 컴파일러가 문자열 비교 가정에서 코드를 최적화하는 방법은 무엇입니까? –

0

"hello"과 같이 문자열 리터럴은 컴파일러에서 읽기 전용 메모리로 구현할 수 있으며 값이 일치 할 경우 해당 리터럴을 실현할 수있는 권리가 있습니다.

따라서 비교 결과는 구현에 따라 달라지며 같은 컴파일러의 여러 버전이나 다른 최적화 옵션에 따라 다를 수 있습니다.

+0

사실, 그의 예제에서 "hello"는'.TEXT '에 전혀 저장되지 않습니다. 하지만 내 게시물의 수정 된 코드에 맞습니다. –

+0

@ MahmoudAl-Qudsi, 귀하의 컴파일러에 대한이 경우 또는 수 있습니다. 이것은 플랫폼의 구현 세부 사항이며 다른 컴파일러는 다르게 수행합니다. –

1

"hello"== "hello"와 같이 두 문자열을 비교하면 Pavan Manjunath가 말한 것처럼 메인에서 비교가 없습니다.

 
    .file "hello.c" 
    .section .rodata 
.LC0: 
    .string "\n equal " 
    .text 
.globl main 
    .type main, @function 

을하지만 두 문자열 "hello2"== 원한다면, 동일하지 않은 경우에 "Hello"다음 컴파일러에 메모리를 할당한다 : 다음 조립체.다음과 같이 그들을 위해 rodata은 accembly에서 보인다이의 분해를 볼 경우

 
    .file "hello.c" 
    .section .rodata 
.LC0: 
    .string "hello2" 
.LC1: 
    .string "hello"