C
Solange alle beteiligten Funktionen darauf achten, den Null-Terminator anzuhängen, dürfte das Vorgehen ausreichen. Auf der sicheren Seite bist du, wenn du trotzdem die Größe mitgibst.
Nein - diese Konstruktion funktioniert nur, wenn du ein echtes Array in der Hand hast (die Funktionen, denen du deinen String übergibst, bekommen aber nur einen Zeiger auf ein Array).
Der neu allokierte Speicher ist nur in der Funktion gültig (die arbeitet mit einer Kopie des Zeigers, den main() ihr übergeben hat) - und was noch schlimmer ist, mit realloc() könntest du dir auch den Speicher pulverisieren, den die main() angefordert hat. Wenn du auf der sicheren Seite sein willst, mußt du den char-Zeiger "per ref" übergeben:
int func(char** pStr,int* pSize)//Zeiger auf char*
{
...
if(...)
{
*pStr = realloc(*pStr,new_size);
*pSize=new_size;
}
...
}
int main()
{
int data_len = //get the basic length
char* data = malloc(data_len);
func(&data,&data_len);
...
}