مشكلة باستخدام مؤشر الفراغ كوسيطة وظيفة
-
25-09-2019 - |
سؤال
لا أستطيع أن أفهم هذه النتيجة ...
الرمز:
void foo(void * key, size_t key_sz) {
HashItem *item = malloc(sizeof(HashItem));
printf("[%d]\n", (int)key);
...
item->key = malloc(key_sz);
memcpy(item->key, key, key_sz);
}
void bar(int num) {
foo(&num, sizeof(int));
}
وأنا أفعل هذه المكالمة: bar(900011009);
لكن ال printf()
الإخراج هو:
[-1074593956]
أنا حقا بحاجة key
أن أكون مؤشرًا باطلاً ، كيف يمكنني إصلاح هذا؟
المحلول
أعتقد أنك بحاجة إلى هذا:
printf("[%d]\n", *(int*)key);
المفتاح هو مؤشر باطل إلى INT ، لذلك تحتاج أولاً إلى الإلقاء على مؤشر INT ، ثم الإطفاء للحصول على int الأصلي.
نصائح أخرى
إذا ألقيت المؤشر إلى int
, ، أنت تحصل على عنوان كقيمة. تحتاج إلى dereference void مؤشرات مثل أي شيء آخر. فقط لا يمكنك dereference مباشرة void *
, ، لذلك يجب عليك أولاً إلقاءها على مؤشر من النوع الصحيح ، هنا int *
. ثم dereference هذا المؤشر ، أي *((int *)key)
(أقواس إضافية لتوضيح الأسبقية).
لا تنتمي إلى StackOverflow