Я давно ничего не делал в C, так что я немного заржавел, но попробую ...
Я вижу, что есть (по крайней мере) два способа заставить это работать: либо вернуть новый указатель для нового массива из функции и сохранить его в старом указателе, что-то вроде (это может быть синтаксически некорректно):
loc_ptr = someFunctionCreatingTheNewArrayAndReturningAPointerToIt(loc_ptr);
Другая возможность - передать loc_ptr в функцию-указатель вместо значения-значения. По сути, вы передадите «указатель-указатель» в качестве параметра в функцию, указатель-указатель будет указывать на вас loc_ptr. Внутри функции вы разыменовываете адрес памяти массивов от указателя к указателю для доступа к исходному массиву. После того, как вы создали и заполнили новый массив, поместите адрес памяти нового массива в параметр, передаваемый по указателю.
Edit: я кратко описал оба способа, это на самом деле в C ++, но я на 99% уверен, что указатели работают в C одинаково (извините, если это немного многословно). Обратите внимание, что массивы нигде не освобождаются, поэтому это может привести к утечкам памяти (но вы должны получить представление о передаче по значению и по указателю):
#include <iostream>
#include <string.h>
struct location
{
std::string name;
double lat;
double lon;
};
location* createNewArrayAndReturnPointer(location* loc)
{
std::cout << "-- Replacing array, name of the first location in old array is " + loc->name << std::endl;
location* newLoc = new location[2]; //Local pointer-variable, creating new array and storing array address to it
newLoc[0].name = "Replacing pointer by return value";
return newLoc; //Return new pointer
}
void modifyViaGivenPointerToPointer(location** loc_ptr_to_ptr)
{
location* loc = *loc_ptr_to_ptr; //De-referencing the array address from the pointer-to-pointer, storing to local pointer-variable
std::cout << "-- Modifying pointer, name of the first location pointed originally is " + loc->name << std::endl;
location* newLoc = new location[2]; //Creating new array and storing to local pointer-variable
newLoc[0].name = "From modifyViaGivenPointerToPointer";
*loc_ptr_to_ptr = newLoc; //Replacing the contents of given pointer-variable via dereference
}
void printNameOfFirstLocationInArray(location* loc_ptr)
{
std::cout << "The name of the first location pointer by loc_ptr is now " << loc_ptr->name << std::endl;
}
int main(void)
{
location locations[2] = {{"Padstow", 50.5384, -4.9378},
{"Newquay", 50.412, -5.0757}};
location* loc_ptr;
loc_ptr = &locations[0];
printNameOfFirstLocationInArray(loc_ptr);
//Returns new pointer from function and store it in the pointer-variable
loc_ptr = createNewArrayAndReturnPointer(loc_ptr);
printNameOfFirstLocationInArray(loc_ptr);
//Modifies the passed pointer-to-pointer, so it points to the new array after returning
modifyViaGivenPointerToPointer(&loc_ptr);
printNameOfFirstLocationInArray(loc_ptr);
return 0;
}
Вывод:
Имя первого указателя местоположения от loc_ptr теперь Padstow
- При замене массива имя первого расположения в старом массиве - Padstow
Имя первого указателя местоположения от loc_ptr теперь заменяет указатель на
возвращаемое значение
- Модифицирующий указатель, имя первого местоположения, на которое указывалось изначально, заменяет указатель на возвращаемое значение
Имя первого указателя местоположения от loc_ptr теперь: от modifyViaGivenPointerToPointer