В C «строка» не является истинным типом данных.Оператор sizeof принимает тип данных или объект, имеющий «тип» в качестве операнда.В вашем случае объект some_string.basic_string
имеет тип char*
, а размер указателя в вашей системе равен 4.
Решение состоит в том, чтобы определить структуру String, имеющую член размера:
struct String {
char *basic_string;
size_t length ;
};
И сохраните размер при выделении в String_New()
.Это упростит и повысит эффективность вашей String_GetSize()
функции (которая уже слишком сложна, поскольку s == i).
Также следует помнить, что в String_New()
параметр basic_string
также является указателем(несмотря на «синтаксис массива», использованный в его подписи).Я хотел бы избежать этого синтаксиса, он вводит в заблуждение, поскольку в C вы не можете передать массив путем копирования, если массив не встроен в структуру;массивы всегда «ухудшаются» до указателей при передаче в качестве аргументов.Более того, вызывающая сторона может передать указатель, а не массив в любом случае.Таким образом, в большинстве случаев вам будет выделено слишком мало памяти (4 байта).Вы должны использовать strlen()
или метод, который вы первоначально использовали в String_GetSize()
, чтобы определить длину.
String String_New(char* basic_string)
{
String temp;
temp.length = strlen( basic_string ) ;
temp.basic_string = (char *) malloc( temp.length + 1 );
strcpy(temp.basic_string, basic_string);
return temp;
}
size_t String_GetSize(String string)
{
return string.length ;
}