Я предполагаю, что должен объявить указатель внутри функции rSmallestCity, как * rtrn, но я предполагаю, что исходная переменная уничтожается перед использованием?
Хороший вопрос. И ваше предположение верно. Создание переменной внутри функции, ее существование заканчивается после выхода из функции. Но в этом случае, поскольку член структуры name
уже является char *
, вам не нужно создавать другую переменную. Просто верните c1.name
. (см. пример кода ниже.)
Несколько других предложений:
В объявлении структуры:
typedef struct Coordinate{
int x,y;
}Coordinate;
Вы использовали тот же символ (Coordinate
) для имени структуры и для ее typedef. Это не очень хорошая практика. Если вам нужно как имя структуры , так и typedef, выберите разные символы. Кстати, в этом примере нужен только один или другой. Скажем, вы выбрали typedef, тогда структура полностью определяется следующим образом:
typedef struct {
int x,y;
}Coordinate;
Это предложение относится к обоим объявлениям struct
в вашем примере кода.
Сигнатуры для функции main
не включают int main(){...}
, а
int main(void){..., return 0;}
и int main(int argc, char *argv[]){..., return 0;}
В следующем примере кода показаны некоторые другие предложения по улучшению комментарии под вашим постом,
typedef struct {
int x,y;
}Coordinate;
typedef struct {
char name[20];
int population;
Coordinate coordinates;
}city;
//return char * rather than char to allow for full null terminated char array (string)
char * rSmallestCity(city c1[],int cityCount)//generisize function prototype to
{ //to easily accommodate bigger arrays if needed
long long size, sizeKeep = 8e9; //index and population. initialize larger than possible population
int indexKeep = 0;
//note you do not need to define a char *, the struct already contains one
for(int i=0; i<cityCount; i++)//use a loop rather than a single comparison, keep the smalles
{
size = c1[i].population;
sizeKeep = (size < sizeKeep) ? indexKeep = i, size : sizeKeep;
}
printf("\n%s\n",c1[indexKeep].name);
return c1[indexKeep].name;
};
int main(void)//use minimum signature for main, and call return before leaving.
{
//combining your original declarations and assignments for struct
//into a single declaration/definition.
city c1[] = {{.name="Mumbai", .population=310, .coordinates.x=3, .coordinates.y=4},
{.name="Delhi", .population=300, .coordinates.x=3, .coordinates.y=2}};
int cityCount = sizeof(c1)/sizeof(c1[0]);
printf("\n%s is smallest",rSmallestCity(c1, cityCount));
return 0;
};