Klar kannst du s zurückgeben, dann hast du aber keine Kopie gemacht und die Funktion ist nutzlos.
Ich vergaß zu erwähnen, dass man natürlich auch per malloc in der Funktion dynamisch den Speicher reservieren kann. Dann muss man diesen allerdings außerhalb wieder freigeben, weshalb man das nicht machen sollte. Aber nun nochmal zurück zu dem Beispiel:
Code:
#include <stdio.h>
char *copy(char s[6]) {
char t[6] ;
int i;
for (i=0; i< 6; i++)
t[i] = s[i];
return t;
}
int main(void) {
printf("%s\n", copy( "Hallo"));
return 0;
}
Das Programm beginnt in der
main-Funktion, dort wird printf mit dem Argument copy("Hallo") aufgerufen. Das entspricht diesem Code:
Code:
char* input = "Hallo";
printf("%s\n", copy(input));
Dadurch dass du "Hallo" an copy übergibst, übergibst du also einen char-Pointer. Du hast jetzt im Speicher irgendwo dein "Hallo" stehen und übergibst einen Zeiger darauf (also nur die Adresse) an die copy-Funktion.
In der copy-Funktion wird jetzt ein neues Array angelegt (t), dass aber nur innerhalb dieser Gültigkeit hat (ein Array ist nichts anderes als ein Pointer, der auf das erste Element zeigt).
Dann werden 6 bytes (chars) beginnend bei s in den Speicher beginnend bei t kopiert. Genauso könnte man schreiben:
Code:
for (i = 0; i < 6; i++)
*(t+i) = *(s+i);
Was du dann aber zurückgibst ist ein Zeiger, der auf das lokal, in der copy-Funktion, deklarierte t zeigt, also nur eine Adresse. Wenn jetzt allerdings in der main-Funktion darauf zugegriffen wird gehört dieser Speicher garnicht mehr deinem Programm.
Mal ein Beispiel wie es funktionieren würde:
Code:
#include <stdio.h>
#include <stdlib.h>
/* kopiert eine vorgegebene Zahl bytes (chars) */
void copy(const char* source, char* target, int count)
{
int i;
for (i = 0; i < count; i++)
target[i] = source[i];
}
/* kopiert bis das stringende erreicht ist (0) */
void strcopy(const char* source, char* target)
{
int i = 0;
while (source[i] != 0)
{
target[i] = source[i];
i++;
}
[COLOR=Red] target[i] = '\0'; /* korrektur von asdfman */[/COLOR]
}
int main(int argc, char** argv)
{
char* str1 = "Hello";
char* str2 = "World";
/* statische speicherallozierung */
char target1[6];
copy(str1, target1, 6);
printf("str1: %s\ntarget1: %s\n", str1, target1);
/* dynamische speicherallozierung */
char* target2 = malloc(6);
strcopy(str2, target2);
printf("str2: %s\ntarget2: %s\n", str2, target2);
free(target2);
return 0;
}
/edit: Korrektur eingefügt, siehe asdfman unten.