#c #function #pointers #arguments
Вопрос:
У меня проблемы с моей программой.
Когда я запускаю программу, консоль не показывает 2 числа , которые она должна показывать, вместо этого она показывает только это:
Process returned -1073741819 (0xC0000005) execution time : 1.759 s
Это мой код:
#include lt;stdio.hgt; #include lt;string.hgt; #include lt;stdlib.hgt; #include lt;iostreamgt; Test(int* Ptr) { Ptr=(int*)malloc(8); if(Ptr==0) { printf("malloc errorn"); } Ptr[0]=155; Ptr[1]=800; } int main() { int* m_Ptr=0; Test(m_Ptr); printf("%d %d",m_Ptr[0],m_Ptr[1]; return 0; }
Комментарии:
1. Вы пытались отладить программу? Вы передаете
m_Ptr
значение по значениюTest
, чтобы печать разыменовала исходный нулевой ptr.2. Попробуйте это вместо этого:
Test(int*amp; Ptr)
3. Он даже не компилируется. Вы отсутствуете
)
в конце 2-гоprintf
и отсутствуете;
вreturn
заявлении. Это то, что вы на самом деле собрали? И этоprogram
, американская орфография…4. Это похоже на C, а не на C . Вы уверены, что знаете, какой язык должна использовать ваша программа?
Ответ №1:
Ваша главная проблема заключается в том, что указатель, который вы передаете в test (), передается копией. Так m_ptr
что значение равно нулю, когда оно передается, и оно по-прежнему равно нулю, когда возвращается тест.
Вы, вероятно, хотите немного изменить свою функцию на что-то более похожее:
int* Test() { int * Ptr = (int*) malloc(20); if(Ptr==0) { printf("malloc errorn"); } Ptr[0]=155; Ptr[1]=800; return Ptr; // Return the pointer by value }
И использовать как (в основном):
int* m_Ptr = Test(m_Ptr); // Now m_Ptr actually points to something...
Ответ №2:
Аргумент Ptr
in test
— это другой объект в памяти, отличный от m_Ptr
in main
— любые изменения test::Ptr
(например, присвоение ему результата malloc
) не отражаются в main::m_Ptr
. Вам придется либо передать указатель или ссылку на m_Ptr
to test
, либо test
вернуть значение указателя, которое вы назначаете m_Ptr
:
m_Ptr = Test(); // returns pointer to newly allocated memory.
Если это должно быть C , то не используйте malloc
(или calloc
, или realloc
). Либо используйте стандартный контейнер, такой как vector
или set
(который автоматически увеличивается по мере добавления новых элементов), либо используйте new
оператор для ручного выделения памяти какому-либо интеллектуальному указателю. Не используйте управление памятью в стиле C в коде C ; это трудоемко, небезопасно и легко ошибиться.
Ответ №3:
С malloc(8)
вашим запросом 8 байт. В 64-битной системе sizeof(int)
может быть 8 байт. Если это так, то строка Ptr[1]=800;
фактически записывается в память за пределами выделенной области.
Попробуйте изменить строку malloc на
Ptr=(int*)malloc(sizeof(int)*2)
Комментарии:
1. Это не поможет с тем фактом, что они разыменовывают
NULL
printf
(что, безусловно, является ошибкой по сравнению с вашим гипотетическим).2. Большое вам спасибо, ребята.