C [duplicate] 'de realloc nasıl kullanılır
Yeniden ayırma işlevini kullanarak belleği yeniden tahsis etmeye çalışıyorum, daha önce malloc kullanmanız gerektiğini gördüm, ancak kullanmanız gerekip gerekmediğini anlamıyorum çünkü diyelim ki aşağıdaki dizeyi oluşturuyorum:
char string[] = "fun";
Daha fazla alan eklemeye çalışırsam realloc işlevi çalışır mı?
bu beni soruma getiriyor, sadece dizenin sonuna bir harf eklemeye çalışıyorum, 'p' diyelim, ama her nedense program her çalıştırdığımda yeniden tahsis hattını eziyor.
İşte tam kodum:
int main()
{
char string[] = "fun" ;
str_func(string);
printf("%s", string);
return 0;
}
void str_func(char* str)
{
str = (char*)realloc(str, strlen(str) + 2);
strcat(str, "p");
}
Ayrıca 'string' için bir işaretçi yapmayı ve aynı sonucu veren işaretçiyi göndermeyi denedim.
Yanıtlar
Daha fazla alan eklemeye çalışırsam realloc işlevi çalışır mı?
Hayır, çünkü bu dizi yığın üzerinde tahsis edilmemiştir - sizin durumunuzda, büyük olasılıkla yığın üzerinde tahsis edilmiştir ve yeniden boyutlandırılamaz. Basitçe söylemek gerekirse: reallocişaretçiyi tanımıyor ve onunla ne yapacağını bilmiyor, ancak yine de bir şeyler yapmaya çalışıyor, dolayısıyla çarpışma.
Yalnızca reallocdaha önce geçirilmiş bir işaretçiyi mallocveya boş bir işaretçiyi çağırabilirsiniz . İşte bu işlevler böyle çalışır.
Ayrıntılar için bkz . Yığın ve öbek üzerinde ne ayrılır? .
Daha önce malloc kullanmanız gerektiğini görmüştüm ama kullanmanız gerekip gerekmediğini anlamıyorum
Bir şeyi yapmadan önce kullanmanız gerekiyorsa , o zaman tanım gereği sadece başlangıçta tahsis edilen şeyleri yapmalısınız .mallocreallocreallocmalloc
"İhtiyaç" ve "zorunluluk" arasında var olmayan bir boşluk bulmaya çalışıyorsunuz.
... bazı nedenlerden dolayı program yeniden tahsisi eziyor
Zaten bildiğiniz söyledi gerekmez kullanmak malloc. O zaman kullanmadın mallocve bunun neden bir sorun olduğunu soruyorsun. Sorunu çözüp çözmediğini görmek için, en azından yapmanız gereken "bildiğiniz" şeyi yapmayı deneyebilirsiniz .
Program muhtemelen şöyle görünmeli
int main()
{
/* array is an automatic local variable. It wasn't dynamically allocated
in the first place, so can't be dynamically re-allocated either.
You cannot (and don't need to) free it either, it just goes out of scope
like any other automatic variable.
*/
char array[] = "fun";
/* you need to use malloc (or one of the other dynamic allocation functions)
before you can realloc, as you said yourself */
char *dynamic = malloc(1+strlen(array));
memcpy(dynamic, array, 1+strlen(array));
/* realloc can move your data, so you must use the returned address */
dynamic = str_func(dynamic);
printf("old:'%s', new:'%s'\n", array, dynamic);
/* not really essential since the program is about to exit anyway */
free(dynamic);
}
char* str_func(char* str)
{
char* newstr = realloc(str, strlen(str) + 2);
if (newstr) {
strcat(newstr, "p");
return newstr;
} else {
/* we failed to make str larger, but it is still there and should be freed */
return str;
}
}
Orijinal durumunuz pek doğru değil: aslında işaretçi geçti realloc
... Daha önce tahsis edilmelidir
malloc(),calloc()ya darealloc()henüz bir serbest çağrı veya realloc ile serbest değil
[VEYA] ptr NULL ise, davranış çağrı ile aynıdır
malloc(new_size).
reallocİşlevi yalnızca (örneğin başlangıçta tahsis fonksiyonları küçük bir grup ile oluşturulan şeylerle çalışır malloc, callocya da realloc, ya da boş gösterici kendisi). Yana stringşeylerden ilgilendirmez, kodunuz iyi tanımlanmış değildir.