struct x {
char a[10];
char b[20];
int i;
char *c;
char *d[10];
};
Saya mengisi struct ini dan kemudian menggunakan nilainya. Pada iterasi berikutnya, saya ingin mengatur ulang semua bidang ke 0
atau null
sebelum saya mulai menggunakannya kembali.
Bagaimana saya bisa melakukan itu? Dapatkah saya menggunakan memset
atau saya harus melalui semua anggota dan kemudian melakukannya secara individu?
c
struct
initialization
hari
sumber
sumber
memset
jika saya hanya ingin mengatur ulang semuanya ke0
??memset
membuat saya merasa kotor. Saya lebih suka membiarkan kompiler khawatir tentang tata letak memori jika memungkinkan. Sebenarnya penggunaan semacammemset
itu tidak portabel tetapi dalam praktiknya saya akan terkejut jika Anda pernah menyusun kode Anda di mana saja yang penting. Jadi, Anda mungkin dapat menggunakan memset dengan aman jika Anda menginginkannya.Cara untuk melakukan hal seperti itu bila Anda memiliki C modern (C99) adalah dengan menggunakan literal majemuk .
a = (const struct x){ 0 };
Ini agak mirip dengan solusi David, hanya saja Anda tidak perlu khawatir untuk mendeklarasikan struktur kosong atau apakah akan mendeklarasikannya
static
. Jika Anda menggunakanconst
seperti yang saya lakukan, kompilator bebas mengalokasikan literal gabungan secara statis dalam penyimpanan hanya-baca jika sesuai.sumber
{ 0 }
sebagai penginisialisasi default. Matikan peringatan itu, itu adalah alarm palsu.Lebih baik dari semua di atas adalah menggunakan spesifikasi Standar C untuk inisialisasi struct:
struct StructType structVar = {0};
Ini semua bit nol (pernah).
sumber
{}
C ++. Gcc devs tampaknya tidak yakin apakah C ++ seharusnya mendukung{0}
dan saya sendiri tidak terbiasa dengan bagian standar itu.{0}
atau{}
. Tidak yakin apakah standar C & C ++ jelas dan sinkron tentang masalah ini, tetapi tampaknya, kompiler tidak.struct StructType structVar = malloc (sizeof(StructType)); structVar ={0}
Di C, itu adalah idiom umum untuk menghilangkan memori untuk
struct
penggunaanmemset
:struct x myStruct; memset(&myStruct, 0, sizeof(myStruct));
Secara teknis, saya tidak percaya bahwa ini portabel karena mengasumsikan bahwa
NULL
penunjuk pada mesin diwakili oleh nilai bilangan bulat 0, tetapi ini digunakan secara luas karena pada sebagian besar mesin demikian.Jika Anda berpindah dari C ke C ++, berhati-hatilah untuk tidak menggunakan teknik ini pada setiap objek. C ++ hanya membuat ini legal pada objek tanpa fungsi anggota dan tidak ada warisan.
sumber
Jika Anda memiliki kompilator yang mendukung C99, Anda dapat menggunakan
mystruct = (struct x){0};
jika tidak, Anda harus melakukan apa yang ditulis David Heffernan, yaitu menyatakan:
struct x empty = {0};
Dan di loop:
sumber
Anda dapat menggunakan
memset
dengan ukuran struct:struct x x_instance; memset (&x_instance, 0, sizeof(x_instance));
sumber
memset
adalah sebuah opsi, tetapi saat menggunakannya, Anda harus memastikan bahwa memori yang ditulis sama ukurannya dengan parameter ketiga, oleh karena itu lebih baik merujuk ke ukuran objek sebenarnya, bukan ukuran jenis yang Anda gunakan. tahu itu saat ini. IOWmemset (&x_instance, 0, sizeof(x_instance));
adalah pilihan yang jauh lebih baik. BTW:(void*)
pemerannya juga berlebihan di C ++.Saya yakin Anda bisa menetapkan set kosong (
{}
) ke variabel Anda.struct x instance; for(i = 0; i < n; i++) { instance = {}; /* Do Calculations */ }
sumber
struct x myX; ... memset(&x, 0, sizeof(myX));
sumber
masukkan deskripsi gambar di sini Kejutan dari gnu11!
typedef struct { uint8_t messType; uint8_t ax; //axis uint32_t position; uint32_t velocity; }TgotoData; TgotoData tmpData = { 0 };
tidak ada yang nol.
sumber