PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Darf man das machen ?



gonso
15-01-2007, 12:46
char *
extract_filename(char *dst, const char *src, size_t n)
{
int i;
char *filename;
char tmp[n];// ???

normalize_path(tmp, src, n);

i = strlen(tmp);

/* remove trailing slashes */
while (i > 0 && tmp[i-1] == '\\') {
--i;
}

if (i == 0) {
tmp[i++] = '\\';
}

/* NULL terminate destination string */
tmp[i] = '\0';

while (--i >= 0 && tmp[i] != '\\');
filename = tmp + i + 1;

memset(dst, 0, n);
strncpy(dst, filename, n);

IRIVER_LOG(6,
"extract_filename\n"
"\tsrc = %s;\n"
"\tdst = %s;\n",
src,
dst);

return dst;
}

Es geht um char tmp[n]. Geht sowas ?
Ich habe das code mit google gefunden.

sveni
15-01-2007, 13:48
hi gonso,

also soweit ich weiss geht das mit c nicht, da dort schon zur compile-zeit die größe des arrays festgelegt werden muss,
z.B. char tmp[50];

Wenn diese nicht bekannt ist, muss der speicher erst allokiert werden:


char *tmp = (char*) malloc (sizeof(char) * n); // n* die anzahl der chars

grüssle
sveni

Yonibear
15-01-2007, 20:05
Ab C99 ist das erlaubt. Die Implementierung durch den Compiler gleicht dann meistens dem Aufruf der Funktion alloca().
Der Vorteil ist, dass man sich gegenüber malloc das free spart weil der Stack automatisch aufgeräumt wird.
Allerdings ist das sicherheitstechnisch problematisch wenn die Größe der Arrays letztendlich von einer Eingabe abhängt, da ein Angriffer so praktisch direkten Zugriff auf den Stack Pointer erhält. Daher empfiehlt es sich trotzdem mit malloc/free zu arbeiten.

gonso
17-01-2007, 04:30
Danke für Antwort Yonibear und sveni.

gruss.