#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdarg.h>
int getSum(char* types, ...)
{
int sum = 0;
va_list ap;
va_start(ap, types);
for (int i = 0; i < sizeof(types) / sizeof(char); i++)
{
switch (types[i])
{
case 'i':
sum += va_arg(ap, int);
break;
case 'd':
va_arg(ap, double);
break;
case 's':
va_arg(ap, char*);
break;
default:
break;
}
}
va_end(ap);
return sum;
}
int main()
{
int num1, num2, num3;
scanf("%d %d %d", &num1, &num2, &num3);
printf("%d\n", getSum("isi", num1, "C", 10));
printf("%d\n", getSum("sdsi", "Hello, world!", 5.3, "A", num2));
printf("%d\n", getSum("iiss", 25, 38, "k", "R"));
printf("%d\n", getSum("sidii", "Hello, C", num3, 2.234567, 878, 1291));
return 0;
}
위 코드에서 printf 4번째 getSum의 types매개변수에 "sidii"가 들어갔을 때 정상적으로 작동을 하지 않습니다.
types에 "sidii"가 들어가게 되면 sizeof(types)는 5가 되어야 하는데,
디버그 값에는 4로 나옵니다.
types의 메모리 주소를 디버그로 확인해봐도 5개가 잘 저장되어 있는데 뭐가 문제인가요??
while문을 사용해 types[i] != '\0'; 으로 하면 되긴 하겠지만, 왜 이 상황에서 sizeof(types)가 4로 적용되는지 궁금합니다.
for (int i = 0; i < sizeof(types) / sizeof(char); i++)
{
printf("size: %llu", sizeof(types));
switch (types[i])
이렇게 해서 보면 sizeof(types)의 결과는 항상 8입니다.
types는 char * 포인터이므로 sizeof(types)는 포인터의 크기를 구하는 것이고, 문자열의 크기를 구하지 않습니다.
Visual Studio에서 조사식에 sizeof(types)를 넣어도 값은 8이고,
printf로 출력해도 8입니다.
32비트 시스템이면 결과는 4이고, 64비트 시스템이면 결과는 8입니다.
sizeof(types)로는 올바른 크기를 구할 수 없으며, while에서 types가 '\0' 널이 아닐 때까지 반복문을 사용하는 게 필요합니다.
types 문자열의 크기를 구해서 하고 싶다면 strlen(types)를 써야 합니다.