2011-11-03 1 views
-1
const char *pointerStr[]= 
{ 
    "BEST123,  ",  // 0x00 
    "Best2233,  ",  // 0x01 
    "ABCDEFGH,  ",  // 0x02 
    "123456,  ",  // 0x03 
    "helloworld,  "  // 0x04 
}; 
typedef struct 
{ 
    char value; 
    char name[40]; 
}StrInfo; 

typedef struct 
{ 
    int regMax; 
    StrInfo info[60]; 
} structNew; 

void main() 
{ 
    int i; 
    structNew pret; 
for (i=0;i<5;i++) 
{  
    printf("PointerStr size of %dth %d \n",i,sizeof(pointerStr[i])); 
    printf("pret size of %dth %d \n",i,sizeof(pret.info[i].name)); 
} 
} 

의 가변 길이 배열 위의 프로그램에 대한 메모리 맵은 크기는 어떻게됩니까? 문자열

PointerStr size of 0th 4 
pret size of 0th 40 
PointerStr size of 1th 4 
pret size of 1th 40 
PointerStr size of 2th 4 
pret size of 2th 40 
PointerStr size of 3th 4 
pret size of 3th 40 
PointerStr size of 4th 4 
pret size of 4th 40 

그때 어떻게 그것을 찾기 위해 각각의 크기와 PointerStr의 모든 문자열을 알고 싶다면

의 결과를? strlen을 사용하는 것만 가능합니까? 다른 방법이 있니? 이 가변 길이 배열을 메모리에 저장하는 방법은 무엇입니까? 결과는 pointerStr이 포인터 변수이고 그 크기가 항상 4 인 becoz입니다. 제가 틀렸다면 수정하십시오.

+0

보통 0으로 끝나는 문자열의 경우 'pointerStr ''strlen'을 사용해야합니다. –

+2

코드에 가변 길이 배열이 없습니다. 모두 컴파일 타임에 고정됩니다. –

답변

7

C 문자열의 길이는 암시 적입니다. 즉, '\0'이 문자열에있는 곳에서 결정되므로 strlen과 같은 함수가 필요하므로 문자열의 길이를 결정해야합니다.

sizeof에 의해 'returned'값은 데이터 자체 대신 유형을보고 컴파일러에서 결정됩니다.

1

크기은 컴파일러의 문제입니다. 컴파일하는 동안 보여지는 것처럼 데이터의 크기를 제공합니다. 실행시 동적 메모리 할당과는 아무런 관련이 없습니다. 그래서 또는 sizeof(p)은 변수가 char* p;으로 선언되는 경우가 많습니다 (32 비트 프로세서에서는 4, 64 비트 프로세서에서는 8). 동적 할당 또는 문자열의 실제 길이와는 아무런 관련이 없습니다. 프로그램이 실행 중일 때.

2

char*에 대한 포인터의 크기 만 가져 오는 이유는 sizeof은 함수 호출이 아니기 때문에 실제로는 컴파일 타임에 계산됩니다 (변수를 제외하고 배열 길이).

코드는 배열과 포인터의 주요 차이점을 보여줍니다. 컴파일 타임에 컴파일러는 배열이 (40) 얼마나되는지를 정적으로 알고 있기 때문에 정확히 알고 있습니다. 반면에 char*은 반드시 null로 끝나는 문자열을 가리킬 필요가 없으므로 포인터의 크기를 반환합니다.

문자열의 길이를 찾는 올바른 방법은 strlen을 사용하는 것입니다. 그러나 이것은 첫 번째 널 바이트 (\0) 이전의 문자 수를 알려줍니다. 얼마나 많은 메모리가 실제로 할당되었는지 알려주지 않습니다 (sizeof40을 반환 할 때 무엇을하고 있습니다).

+0

@undur_gongor 좋은 지적. 편집 됨. –

1

sizeof는 전달 된 변수의 크기 (바이트)를 제공합니다. sizeof에 포인터 배열 (문자열을 가리키고 있음)을 전달하고 있습니다. 포인터를 C로 "감쇠"하는 배열이므로 포인터의 배열에서 첫 번째 요소에 대한 포인터입니다.

그리고 나서 포인터 크기를 바이트 단위로 정확하게 얻습니다 (4 바이트 = 32 비트 주소 버스).

"array decay"규칙으로 인해 포인터를 통해 문자열 리터럴의 실제 메모리 셀 크기를 얻을 수있는 방법이 없습니다. 동일한 이유로 인해 배열의 크기를 가져올 수없는 것과 같은 이유입니다. 이 예에서 포인터 PTR은 :

char array[10] = "..."; 
char* ptr = &array; 

이 솔루션은 (진정한 2D 배열과 같은) 배열 자체에 sizeof 연산자를 사용하거나 모든 배열의 크기를 저장할 위치를 다른 방식으로 배열을 저장하는 중입니다 룩업 테이블 :

const size_t STRING_SIZES[] = 
{ 
    sizeof("BEST123,  "), 
    sizeof("Best2233,  "), 
    sizeof("ABCDEFGH,  "), 
    sizeof("123456,  "), 
    sizeof("helloworld,  ") 
};