Проблема с указателем при использовании с функциями в c

#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. Большое вам спасибо, ребята.