Soru malloc kullanırken "void *" ile "char *" arasındaki geçersiz dönüşüm?


5. satırdaki hatayla aşağıdaki kodla ilgili sorun yaşıyorum:

hata: geçersiz dönüşüm void* için char*

G ++ ile codeblocks kullanıyorum ve bu dosyayı bir cpp dosyası olarak derlemeye çalıştım. Önemli mi?

#include <openssl/crypto.h>
int main()
{
    char *foo = malloc(1);
    if (!foo) {
        printf("malloc()");
        exit(1);
    }
    OPENSSL_cleanse(foo, 1);
    printf("cleaned one byte\n");
    OPENSSL_cleanse(foo, 0);
    printf("cleaned zero bytes\n");
}

44
2018-02-24 02:20


Menşei


Evet, önemli. Görmek david.tribble.com/text/cdiffs.htm#C99-void-ptr . - Adam Rosenfield
Bağırmak için şimdiden özür dilerim ama C + C OLMADAN CLE OLMAYIN. Aynı dil değiller. - R..
Bu soru hem c ve c++. Lütfen birini seçin, sonra diğer etiketi kaldırın. - Lightness Races in Orbit


Cevaplar:


C ++’da malloc()

char *foo = (char*)malloc(1);

87
2018-02-24 02:21



C ++’da, C’de değil. - Marlon
C kodu yazıyorsanız (ve iseniz), dosya adı için .c uzantısını kullanın ve iyi olacaksınız. - karlphillip
@lost_with_coding - C ++ kullanıyorsanız, lütfen onu etiketlemeyin [c]. Bu cevap açıkça göründüğü gibi, aynı değil. - Chris Lutz
Sadece bir çok insanın, özellikle C ve C ++ arasında çok fazla değişime uğrayan programcıları olan bir çalışma tarzı olarak, C cinsinden bile açıkça yapılmasını tercih ettiğini belirtmek istedim. - Karl Bielefeldt
@Karl Bielefeldt ama eğer bir stil meselesi olarak yapılıyorsa, C'de yapılması yanlış bir şey. Stdlib.h dahil edilmemesi, malloc'un bir int dönüşünde gizli olarak tanımlanmasına neden olur. Bu, cast int ile bazı işaretçiler arasında gizliyse hatalar gösterecektir, ancak doğru tür için açık bir yayın varsa hataları göstermeyecektir. Daha güvenli C formunu kullanmak kesinlikle daha iyi bir stil midir? - James Greenhalgh


C ++, C'den daha güvenli bir şekilde tasarlanmıştır, bu nedenle (otomatik olarak) dönüştüremezsiniz itibaren  void*  için başka bir işaretçi tipi. Dosyanız bir .cpp, derleyiciniz C ++ kodunu beklemektedir ve daha önce de belirtildiği gibi, malloc çağrınız sizin char* bir void*.

Dosyanızı bir .c sonra C kodu bekler. C'de, arasında bir yayın belirtmeniz gerekmez. void* ve başka bir işaretçi türü. Dosyanızı bir .c başarıyla derler.


20
2018-02-24 02:24





Sanırım bu malloc'lu hat. Sadece sonucu oyala - char *foo = (char*)...


4
2018-02-24 02:22





Peki amacın neydi? Bir C programı veya C ++ programı yazmaya çalışıyor musunuz?

Bir C programına ihtiyacınız varsa, C ++ olarak derlemeyin, yani dosyanızı ".cpp" uzantısına eklemeyin ya da derleyicinizden dosyayı C olarak işleme tabi tutmasını isteyin. C dilinde sonuç almamalısınız. arasında malloc. Sorunuzu [C] olarak etiketlediğinizden bu ihtiyacın olanı kabul ediyorum.

Kullandığı bir C ++ programına ihtiyacınız varsa malloc, o zaman başka bir seçeneğiniz yok. malloc uygun tipte.


4
2018-02-24 02:39