2011-05-01 1 views
1

다음을 고려하십시오. sizeof가 "23"을 반환하는 이유는 무엇입니까? 그리고 어떻게 실제 크기를 얻을 수 있습니까? (없이 계수 ㅎ)거친 off-the-mark 값을주는 문자 배열 크기

char defaultsettings[] = "<?xml version=\"1.0\"?>\n"; 
strcat(defaultsettings, "<CsSettings>\n<options>\n"); 
strcat(defaultsettings, "<spin name=\"maxTries\" value=\"1000\" />\n"); 
strcat(defaultsettings, "<spin name=\"rollCount\" value=\"1\" />\n"); 
strcat(defaultsettings, "<check name=\"matchItems\" value=\"1\" />\n"); 
strcat(defaultsettings, "<check name=\"highlightItems\" value=\"1\" />\n"); 
strcat(defaultsettings, "<check name=\"buyListMode\" value=\"0\" />\n"); 
strcat(defaultsettings, "<radio name=\"matchItemType\" value=\"0\" />\n"); 
strcat(defaultsettings, "<check name=\"matchLocations\" value=\"0\" />\n"); 
strcat(defaultsettings, "<check name=\"highlightLocations\" value=\"1\" />\n"); 
strcat(defaultsettings, "<check name=\"allMissionsSameLocation\" value=\"0\" />\n"); 
strcat(defaultsettings, "<check name=\"highlightFind\" value=\"0\" />\n"); 
strcat(defaultsettings, "<check name=\"highlightReturn\" value=\"0\" />\n"); 
strcat(defaultsettings, "<check name=\"highlightRepair\" value=\"0\" />\n"); 
strcat(defaultsettings, "<check name=\"highlightPerson\" value=\"0\" />\n"); 
strcat(defaultsettings, "<check name=\"highlightKill\" value=\"0\" />\n"); 
strcat(defaultsettings, "<check name=\"ignoreFind\" value=\"0\" />\n"); 
strcat(defaultsettings, "<check name=\"ignoreReturn\" value=\"0\" />\n"); 
strcat(defaultsettings, "<check name=\"ignoreRepair\" value=\"0\" />\n"); 
strcat(defaultsettings, "<check name=\"ignorePerson\" value=\"0\" />\n"); 
strcat(defaultsettings, "<check name=\"ignoreKill\" value=\"1\" />\n"); 
strcat(defaultsettings, "<combo name=\"itemValueBase\" value=\"1\" />\n"); 
strcat(defaultsettings, "<check name=\"matchMissionValue\" value=\"0\" />\n"); 
strcat(defaultsettings, "<spin name=\"matchMissionMinValue\" value=\"10000\" />\n"); 
strcat(defaultsettings, "<check name=\"levelCalcFixerMode\" value=\"0\" />\n"); 
strcat(defaultsettings, "<spin name=\"bneBonus\" value=\"1\" />\n"); 
strcat(defaultsettings, "<spin name=\"levelCalc\" value=\"1\" />\n"); 
strcat(defaultsettings, "<spin name=\"missionCalc\" value=\"1\" />\n"); 
strcat(defaultsettings, "<check name=\"log\" value=\"0\" />\n"); 
strcat(defaultsettings, "<entry name=\"useKey\" value=\"e\" />\n"); 
strcat(defaultsettings, "</options>\n<items>\n</items>\n"); 
strcat(defaultsettings, "<locations>\n<location>\n<string>Milky way</string>\n"); 
strcat(defaultsettings, "<x>\n<var>3050</var>\n<var>3400</var>\n</x>\n"); 
strcat(defaultsettings, "<y>\n<var>1000</var>\n<var>1200</var>\n</y>\n"); 
strcat(defaultsettings, "<ignore>1</ignore>\n<enabled>1</enabled>\n"); 
strcat(defaultsettings, "<coordsEnabled>1</coordsEnabled>\n"); 
strcat(defaultsettings, "</location>\n<location>\n<string>Milky way</string>\n"); 
strcat(defaultsettings, "<x>\n<var>3500</var>\n<var>3850</var>\n</x>\n"); 
strcat(defaultsettings, "<y>\n<var>700</var>\n<var>950</var>\n</y>\n"); 
strcat(defaultsettings, "<ignore>1</ignore>\n<enabled>1</enabled>\n"); 
strcat(defaultsettings, "<coordsEnabled>1</coordsEnabled>\n"); 
strcat(defaultsettings, "</location>\n</locations>\n</CsSettings>"); 
printf("%s\nSize: %d\n\n",defaultsettings,sizeof(defaultsettings)); 

출력 :

[...] 
</location> 
</locations> 
</CsSettings> 
Size: 23 
+0

C 언어에 대한 신용은 좋지 않지만 일반적으로 좋지 않은 코드입니다. 파일을 사용하십시오. –

답변

7

오 사랑!

첫 번째 줄에는 23 문자의 메모리 만 할당했기 때문에 나머지 데이터에 대해서는 할당되지 않은 메모리를 덮어 쓰게되기 때문입니다. 이것은 당신에게 적절한의 하나 배열을 얻을 것이다

const char long_string[] = "First line" 
"next line" 
"another line" 
"even more text"; 

:

당신은 실제로 여기, 당신은 단지에 인접한 문자열 리터럴을 연결 한 후 C 프리 프로세서의 기능을 사용할 수 있습니다 strcat와의 어떤 필요하지 않습니다 크기.

+0

나는 그것이 그와 같다고 생각했다. 그러나 나는 25를 세었다. 오 잘, 그것은 작동한다! –

+0

오 예, null 종결자를 기억하지만 따옴표에서 백 슬래시를 잊어 버렸습니다. 감사합니다! –

3

배열의 크기는 하나 개의 문장으로 정의되어 있기 때문에 : 나머지 strcat() 통화 단지 (정의되지 않은 동작입니다) 배열의 끝을지나 작성하는

char defaultsettings[] = "<?xml version=\"1.0\"?>\n"; 

.

나는 당신의 테스트가 충돌하지 않는다는 것에 조금 놀랐습니다.